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
00026
00027
00028
00029
00030
00031 #ifndef INCLUDED_SequenceEncoder
00032 #define INCLUDED_SequenceEncoder
00033
00034
00035
00036
00037 #include "GlobalDefinitions.h"
00038
00039
00040
00041 class SequenceReaderMode;
00042
00043
00044
00045
00046 static const int numPossibleChars(1<<8);
00047
00048 typedef Word TranslationTable[numPossibleChars];
00049 typedef Word ExpandedTranslationTable[numPossibleChars*numPossibleChars];
00050
00051 static const Word nv(0xFF);
00052 static const Word firstCharInvalid(1<<31);
00053 static const Word secondCharInvalid(1<<30);
00054 static const Word someCharInvalid(firstCharInvalid|secondCharInvalid);
00055
00056 static const Word maskBase(0x3);
00057 static const Word mask2Bases((maskBase<<gBaseBits)|maskBase);
00058 static const Word maskCodon((mask2Bases<<gBaseBits)|maskBase);
00059
00060
00061 static const char flaggedChar('^');
00062
00063
00064 static const TranslationTable ttDNA =
00065 {
00066 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00067 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00068 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00069 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00070 nv,
00071 00,nv,01,nv,nv,nv,02,nv,nv,nv,nv,nv,nv,nv,nv,
00072 nv,nv,nv,nv,03,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00073 nv,
00074 00,nv,01,nv,nv,nv,02,nv,nv,nv,nv,nv,nv,nv,nv,
00075 nv,nv,nv,nv,03,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00076 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00077 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00078 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00079 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00080 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00081 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00082 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00083 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv
00084 };
00085
00086 #ifdef OLD_PROTEIN_TRANSLATION_TABLE
00087 static const TranslationTable ttProtein =
00088 {
00089 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00090 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00091 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv, 0,nv,nv,nv,nv,nv,
00092 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00093 nv,
00094 1,nv, 2, 3, 4, 5, 6, 7, 8,nv, 9,10,11,12,nv,
00095 13,14,15,16,17,18,19,20,nv,21,nv,nv,nv,nv,nv,nv,
00096 nv,
00097 1,nv, 2, 3, 4, 5, 6, 7, 8,nv, 9,10,11,12,nv,
00098 13,14,15,16,17,18,19,20,nv,21,nv,nv,nv,nv,nv,nv,
00099 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00100 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00101 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00102 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00103 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00104 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00105 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00106 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv
00107 };
00108 #endif
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 static const TranslationTable ttProtein =
00142 {
00143 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00144 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00145 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv, 0,nv,nv,nv,nv,nv,
00146 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00147 nv,
00148 1, 3, 2, 3, 4, 5, 6, 7, 8,nv, 9,10,11,12,nv,
00149 13,14,15,16,17,20,18,19,20,21, 4,nv,nv,nv,nv,nv,
00150 nv,
00151 1, 3, 2, 3, 4, 5, 6, 7, 8,nv, 9,10,11,12,nv,
00152 13,14,15,16,17,20,18,19,20,21, 4,nv,nv,nv,nv,nv,
00153 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00154 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00155 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00156 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00157 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00158 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00159 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00160 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv
00161 };
00162
00163
00164 static const TranslationTable ttCodon =
00165 {
00166 9 ,
00167 12,
00168 9 ,
00169 12,
00170 17,
00171 17,
00172 17,
00173 17,
00174 15,
00175 16,
00176 15,
00177 16,
00178 8 ,
00179 8 ,
00180 11,
00181 8 ,
00182 14,
00183 7 ,
00184 14,
00185 7 ,
00186 13,
00187 13,
00188 13,
00189 13,
00190 15,
00191 15,
00192 15,
00193 15,
00194 10,
00195 10,
00196 10,
00197 10,
00198 4 ,
00199 3 ,
00200 4 ,
00201 3 ,
00202 1 ,
00203 1 ,
00204 1 ,
00205 1 ,
00206 6 ,
00207 6 ,
00208 6 ,
00209 6 ,
00210 18,
00211 18,
00212 18,
00213 18,
00214 0 ,
00215 21,
00216 0 ,
00217 21,
00218 16,
00219 16,
00220 16,
00221 16,
00222 0 ,
00223 2 ,
00224 19,
00225 2 ,
00226 10,
00227 5 ,
00228 10,
00229 5 ,
00230 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00231 nv,nv,nv,nv,nv,nv,nv,nv,20,nv,nv,nv,nv,nv,nv,nv,
00232 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00233 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00234 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00235 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00236 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00237 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00238 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00239 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00240 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00241 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv
00242 };
00243
00244
00245
00246 static const TranslationTable ttCodonReverse =
00247 {
00248 5 ,
00249 19,
00250 10,
00251 8 ,
00252 2 ,
00253 6 ,
00254 15,
00255 16,
00256 16,
00257 1 ,
00258 13,
00259 17,
00260 21,
00261 3 ,
00262 7 ,
00263 12,
00264 10,
00265 19,
00266 10,
00267 11,
00268 20,
00269 6 ,
00270 15,
00271 15,
00272 16,
00273 1 ,
00274 13,
00275 17,
00276 0 ,
00277 4 ,
00278 14,
00279 9 ,
00280 5 ,
00281 19,
00282 10,
00283 8 ,
00284 2 ,
00285 6 ,
00286 15,
00287 16,
00288 16,
00289 1 ,
00290 13,
00291 17,
00292 21,
00293 3 ,
00294 7 ,
00295 12,
00296 10,
00297 19,
00298 10,
00299 8 ,
00300 0 ,
00301 6 ,
00302 15,
00303 15,
00304 16,
00305 1 ,
00306 13,
00307 17,
00308 0 ,
00309 4 ,
00310 14,
00311 9 ,
00312 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00313 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00314 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00315 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00316 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00317 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00318 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00319 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00320 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00321 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00322 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,
00323 nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv,nv
00324 };
00325
00326 typedef vector<char> CodonList;
00327
00328
00329
00330
00331 class SequenceEncoder
00332 {
00333
00334
00335 public:
00336
00337
00338
00339
00340
00341
00342
00343 SequenceEncoder
00344 ( const TranslationTable* tt,
00345 SourceDataType sourceData,
00346 int bitsPerSymbol,
00347 int wordLength,
00348 ostream& monitoringStream = cerr);
00349
00350 SequenceEncoder( const SequenceEncoder& rhs );
00351
00352
00353
00354
00355
00356 virtual ~SequenceEncoder();
00357
00358
00359 virtual SequenceEncoder* clone( void )
00360 {
00361 return new SequenceEncoder(*this);
00362 }
00363
00364
00365
00366
00367
00368
00369 void changeMode( SequenceReaderMode* pMode );
00370
00371
00372
00373
00374
00375 void linkSeq( WordSequence& seq )
00376 { pSeq_=&seq;
00377 pSeq_->clear();
00378 pSeq_->push_back(0);
00379 pSeq_->setNumBasesInLast(0); }
00380
00381
00382 virtual void encode( const char* data, int numChars );
00383 void encode( const string& data, int numChars=-1 )
00384 { encode(data.c_str(),
00385 (numChars!=-1)?numChars:data.size()); }
00386 void encode( const CodonList& data, int numChars=-1 )
00387 { encode( (const char*)&data[0],
00388 (numChars!=-1)?numChars:data.size()); }
00389
00390
00391
00392 void encodeChar
00393 ( uchar thisChar, Word& thisWord, Word& wordFlag, int& basesInLast );
00394
00395 void addWord
00396 ( Word& thisWord, Word& thisFlag, int& basesInLast );
00397
00398
00399
00400
00401
00402
00403 void expandTranslationTable
00404 ( ExpandedTranslationTable& ett );
00405
00406
00407 void unlinkSeq( void );
00408
00409 void setWordLength( int wordLength )
00410 {
00411
00412 if ( ( bitsPerSymbol_*wordLength ) > (int)(8*sizeof(Word)) )
00413 {
00414 int * fred(NULL); fred[0] = 9999;
00415 throw SSAHAException("Symbol data exceeds capacity of Word!\n");
00416 }
00417 wordLength_ = wordLength;
00418
00419
00420 }
00421
00422
00423
00424
00425 SourceDataType getSourceDataType( void ) const { return sourceData_; }
00426 int getWordLength( void ) const { return wordLength_; }
00427 int getBitsPerSymbol( void ) const { return bitsPerSymbol_; }
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438 protected:
00439
00440
00441
00442
00443
00444 private:
00445 SequenceEncoder& operator=(const SequenceEncoder&);
00446
00447
00448 protected:
00449 ostream& monitoringStream_;
00450 const TranslationTable* tt_;
00451 const ExpandedTranslationTable* ett_;
00452 const SourceDataType sourceData_;
00453 const int bitsPerSymbol_;
00454 const Word symbolMask_;
00455 int wordLength_;
00456 WordSequence* pSeq_;
00457 SequenceReaderMode* pState_;
00458
00459
00460 Word wordFlag_;
00461 int numSymbolPairs_;
00462
00463 const int doubleBitShift_;
00464
00465 };
00466
00467 class SequenceEncoderDNA : public SequenceEncoder
00468 {
00469 public:
00470 SequenceEncoderDNA( int wordLength=10, ostream& monStream=cerr );
00471
00472 protected:
00473 static ExpandedTranslationTable ettSource_;
00474 static bool isExpanded_;
00475 };
00476
00477 class SequenceEncoderProtein : public SequenceEncoder
00478 {
00479 public:
00480 SequenceEncoderProtein( int wordLength=5, ostream& monStream=cerr );
00481
00482 protected:
00483 static ExpandedTranslationTable ettSource_;
00484 static bool isExpanded_;
00485
00486 };
00487
00488 class SequenceEncoderCodon : public SequenceEncoder
00489 {
00490 public:
00491 SequenceEncoderCodon( int wordLength=5, ostream& monStream=cerr );
00492
00493
00494
00495 protected:
00496 static ExpandedTranslationTable ettSource_;
00497 static bool isExpanded_;
00498
00499 };
00500
00501
00502
00503 ostream& operator<<( ostream& os, CodonList& c );
00504
00505
00506
00507
00508
00509
00510
00511
00512 void codonize
00513 ( const WordSequence& in, CodonList& codons, int readingFrame );
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525 template <int CODON_SHIFT, int BASE_SHIFT >
00526 Word getCodonFromWord( const Word& w )
00527 {
00528 return
00529 (
00530 (w&gCursedWord)
00531 ? flaggedChar
00532 : ( ( w & ( maskCodon << ((CODON_SHIFT*gCodonBits)
00533 + (BASE_SHIFT*gBaseBits) ) ) )
00534 >> ((CODON_SHIFT*gCodonBits) + (BASE_SHIFT*gBaseBits) ) )
00535 );
00536
00537
00538 }
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558 void codonizeAndFlag
00559 ( const WordSequence& in, CodonList& codons, int readingFrame );
00560
00561
00562
00563
00564
00565
00566
00567
00568 void codonizeAndFlagReverse
00569 ( const WordSequence& in, CodonList& codons, int readingFrame );
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583 void print( const TranslationTable& tt );
00584
00585
00586
00587
00588 #endif
00589
00590
00591