--- /dev/null
+/**
+ * Author: Mark Larkin
+ *
+ * Copyright (c) 2007 Des Higgins, Julie Thompson and Toby Gibson.
+ */
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+#include <algorithm>
+#include "Sequence.h"
+
+using namespace std;
+
+namespace clustalw
+{
+
+/**
+ *
+ * @param seq
+ * @param name
+ * @param title
+ * @return
+ */
+Sequence::Sequence(string& seq, string& name, string& title)
+{
+ copyStringIntoVector(&_sequence, &seq);
+ encodeSequence();
+ _name = name;
+ _title = title;
+ identifier = utilityObject->getUniqueSequenceIdentifier();
+}
+
+Sequence::Sequence(std::string& seq, std::string& name, std::string& title, unsigned long id)
+{
+ copyStringIntoVector(&_sequence, &seq);
+ encodeSequence();
+ _name = name;
+ _title = title;
+ identifier = id;
+}
+
+/**
+ * This is an overloaded contructor that is used to construct a seq object from an
+ * encoded sequenced instead of a string.
+ * @param encodedSequence
+ * @param name
+ * @param title
+ * @param id The unique identifier from the previous sequence!!!
+ * @return
+ */
+Sequence::Sequence(std::vector<int>* encodedSequence, std::string& name, std::string& title,
+ unsigned long id)
+{
+ _encodedSequence = *encodedSequence;
+ _name = name;
+ _title = title;
+ identifier = id;
+}
+
+/**
+ *
+ */
+void Sequence::encodeSequence()
+{
+ /* code seq as ints .. use gapPos2 for gap */
+ std::vector<char>::iterator it;
+
+ _encodedSequence.push_back(0);
+
+ for(it = _sequence.begin(); it != _sequence.end(); ++it)
+ {
+ if (*it == '-')
+ {
+ _encodedSequence.push_back(userParameters->getGapPos2());
+ }
+ else
+ {
+ _encodedSequence.push_back(userParameters->resIndex(
+ userParameters->getAminoAcidCodes(), *it));
+ }
+ }
+}
+
+/**
+ *
+ * @param _vectorTo
+ * @param _stringFrom
+ */
+void Sequence::copyStringIntoVector(vector<char>* _vectorTo, string* _stringFrom)
+{
+ _vectorTo->clear();
+
+ for(int i = 0; i < (int)_stringFrom->size(); i++)
+ {
+ _vectorTo->push_back(_stringFrom->at(i));
+ }
+
+ if(_vectorTo->size() != _stringFrom->size())
+ {
+ std::cerr << "Error: In function copyStringIntoVector. Strings different length!\n";
+ exit(1);
+ }
+}
+
+/**
+ *
+ */
+void Sequence::printSequence()
+{
+ std::cout << "This is the sequence and the encoded sequence " << _name << std::endl;
+
+ std::vector<char>::iterator itChar;
+ for(itChar = _sequence.begin(); itChar != _sequence.end(); ++itChar)
+ {
+ cout << *itChar;
+ }
+ cout << std::endl;
+
+ std::vector<int>::iterator itInt;
+ for(itInt = _encodedSequence.begin(); itInt != _encodedSequence.end(); ++itInt)
+ {
+ cout << " " << *itInt;
+ }
+ cout << std::endl;
+}
+
+/**
+ *
+ */
+void Sequence::checkIntegrity()
+{
+ // The sequences should be the same length.
+ if(_sequence.size() != _encodedSequence.size())
+ {
+ std::cerr << "Error: _sequence is not same size as _encodedSequence\n";
+ exit(1);
+ }
+}
+
+/**
+ *
+ * @return the encoded sequence, this is what is used in the pairwise!
+ */
+std::vector<int>* Sequence::getSequence()
+{
+ return &_encodedSequence;
+}
+
+/**
+ *
+ * @return
+ */
+std::string Sequence::getName()
+{
+ return _name;
+}
+
+/**
+ *
+ * @return
+ */
+std::string Sequence::getTitle()
+{
+ return _title;
+}
+
+/**
+ *
+ * @return
+ */
+bool Sequence::isEmpty()
+{
+ if(_sequence.size() == 0)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+
+}
+
+/**
+ *
+ * @return
+ */
+bool Sequence::checkDNAFlag()
+// check if DNA or Protein
+// The decision is based on counting all A,C,G,T,U or N.
+// If >= 85% of all characters (except -) are as above => DNA
+{
+ int c, numResidues, numBases;
+ float ratio;
+ string dna_codes = "ACGTUN";
+
+ numResidues = numBases = 0;
+
+ vector<char>::iterator seqIterator = _sequence.begin();
+
+ while (seqIterator != _sequence.end())
+ {
+ if (*seqIterator != '-')
+ {
+ numResidues++;
+ if (*seqIterator == 'N')
+ {
+ numBases++;
+ }
+ else
+ {
+ c = userParameters->resIndex(dna_codes, *seqIterator);
+ if (c >= 0)
+ {
+ numBases++;
+ }
+ }
+ }
+ seqIterator++;
+ }
+
+ if ((numBases == 0) || (numResidues == 0))
+ {
+ return false;
+ }
+ ratio = (float)numBases / (float)numResidues;
+
+ if (ratio >= 0.85)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+}
+