/** * Author: Mark Larkin * * Copyright (c) 2007 Des Higgins, Julie Thompson and Toby Gibson. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #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* 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::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* _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::iterator itChar; for(itChar = _sequence.begin(); itChar != _sequence.end(); ++itChar) { cout << *itChar; } cout << std::endl; std::vector::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* 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::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; } } }