/***************************************************************************** # Copyright (C) 1994-2008 by David Gordon. # All rights reserved. # # This software is part of a beta-test version of the Consed/Autofinish # package. It should not be redistributed or # used for any commercial purpose, including commercially funded # sequencing, without written permission from the author and the # University of Washington. # # This software is provided ``AS IS'' and any express or implied # warranties, including, but not limited to, the implied warranties of # merchantability and fitness for a particular purpose, are disclaimed. # In no event shall the authors or the University of Washington be # liable for any direct, indirect, incidental, special, exemplary, or # consequential damages (including, but not limited to, procurement of # substitute goods or services; loss of use, data, or profits; or # business interruption) however caused and on any theory of liability, # whether in contract, strict liability, or tort (including negligence # or otherwise) arising in any way out of the use of this software, even # if advised of the possibility of such damage. # # Building Consed from source is error prone and not simple which is # why I provide executables. Due to time limitations I cannot # provide any assistance in building Consed. Even if you do not # modify the source, you may introduce errors due to using a # different version of the compiler, a different version of motif, # different versions of other libraries than I used, etc. For this # reason, if you discover Consed bugs, I can only offer help with # those bugs if you first reproduce those bugs with an executable # provided by me--not an executable you have built. # # Modifying Consed is also difficult. Although Consed is modular, # some modules are used by many other modules. Thus making a change # in one place can have unforeseen effects on many other features. # It may takes months for you to notice these other side-effects # which may not seen connected at all. It is not feasable for me to # provide help with modifying Consed sources because of the # potentially huge amount of time involved. # #*****************************************************************************/ // // Ntide.h // // header file for Ntide class // // #ifndef NTIDE_INCLUDED #define NTIDE_INCLUDED #ifdef SCCS_ID static const char* ntideSccsId = "@(#)ntide.h 1.18 05/21/96 09:49:52"; #endif #include #include using namespace std; #include "sysdepend.h" #include "quality.h" #include "cComplementBase.h" #include "assert.h" // char used to represent pad application-wide is defined here static const char ntidePadChar = '*'; static const int nGetBaseUpperOrLowerLookupFirstSubscript = 256; static const int nGetBaseUpperOrLowerLookupSecondSubscript = 100; class Ntide { public: // simple character representation char cBase_; // quality object is currently an int score stored in 1 byte Quality ucQual_; static unsigned char ucGetBaseUpperOrLowerSetQualityThreshold_; static char cGetBaseUpperOrLowerLookup_[ nGetBaseUpperOrLowerLookupFirstSubscript ][ nGetBaseUpperOrLowerLookupSecondSubscript ]; public: Ntide() : cBase_( '\0' ), ucQual_ ( ucDefQualValue ) {}; ~Ntide() {}; // for our subclasses // quality values are still indicated by upper/lower case // in the phrap output. Ntide(char c) : cBase_(c) { initQualFromChar(c); } // ctor taking all members for args Ntide(char c, const Quality q ) : cBase_( c ), ucQual_ ( q ) { assert( ucQualityMin <= q ); assert( q <= ucQualityMax ); } // cast to char operator char() const { return cBase_; } // ok--now I've tried the (char) cast, but I still like explicit // methods better: char cGetBase() const { return cBase_; } // returns upper or lower case base according to quality threshold char cGetBaseUpperOrLower() const; char cGetBaseUpperOrLowerUnsafe() const; static void setGetBaseUpperOrLowerLookupTableIfNecessary(); // simple assignment operator // Without this, the sgi compiler would handle, for example: // daReadNtidesBeforeEdit_.append( // pLocatedFragment_->ntGetFragFromConsPos( nCons ) // ); // by using the "operator char()" above to get a char from // pLocatedFragment_->ntGetFragFromConsPos( nCons ) // and then use the // "operator=( const char c )" (below) to do the append which // does an assignment. "operator=(const char c)" sets the // quality to 0. This caused quality to become zero when // making and undoing making bases n's or overstriking. Ntide& operator= (const Ntide& nt); // comparison does not take into account point position bool operator == (const Ntide& nt) const { return (cBase_ == nt.cBase_) && (ucQual_ == nt.ucQual_); } // assignment from char Ntide& operator=(const char c) { cBase_ = c; initQualFromChar(c); // same conversion from char as above return *this; } // sets the base (while leaving the point position and quality) // (This is used in changing bases to N ) void setBase(const char cBase) { cBase_ = cBase; } // returns quality object const Quality& qualGetQuality() const { return ucQual_; } const Quality qualGetQualityWithout98or99() const { Quality uc = ucQual_; convertFrom9899QualityToNormalQuality( uc ); return( uc ); } const Quality qualGetQualityWithout98or99X0() const { if ( cBase_ == 'x' ) { return 0; } else { return qualGetQualityWithout98or99(); } } // sets the quality object void setQuality(const Quality& q) { assert( ucQualityMin <= q ); assert( q <= ucQualityMax ); ucQual_ = q; } // returns bool indicating if base == pad char. // avoids proliferating ascii constant pad char // ie. "if (ntide.bIsPad())" instead of if "(ntide == '*')" bool bIsPad() const { return cBase_ == ntidePadChar; } // friend ostream& operator << (ostream& os, const Ntide& nt); void complementBase() { cBase_ = cComplementBase( cBase_ ); } // // complements the ntide object and returns a reference to itself // Ntide& ntComplementNtide() { // cBase_ = cComplementBase( cBase_ ); // return( *this ); // } // // this variant complements the point position as well // Ntide& ntComplementNtide(const short int nMaxPos) { // // trying to complement the point position of // // an Ntide which has never been set throws exception // // assert (nPointPos_ != nUninitializedPointPos); // // I think point positions start at 1, so add 1 (DG) // // No--point positions start at 0 // nPointPos_ = nMaxPos - nPointPos_; // return ntComplementNtide(); // then call above version // } private: void initQualFromChar(const char c) { if (c == ntidePadChar) { ucQual_ = ucQualityMin; } else if (isalpha(c)) { if ((c == 'n') || (c == 'N')) { ucQual_ = ucQualityMin; } else if (isupper(c)) { ucQual_ = ucQualityHigh; } else { ucQual_ = ucQualityLow; } } else { assert (false); // bomb } } // initQualFromChar }; // class Ntide // Ntide objects can be intermixed with predefined insertion // operators for ostreams (e.g. "cout << ntideMine << endl;") ostream& operator << (ostream& os, const Ntide& nt); #endif // NTIDE_INCLUDED