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
00032
00033
00034 #include "GlobalDefinitions.h"
00035 #include "HashTable.h"
00036 #include <iostream>
00037 #include <ctime>
00038
00039
00040
00041 char* getTimeNow(void)
00042 {
00043 time_t now = time(NULL);
00044 tm* ptime = localtime(&now);
00045 return asctime(ptime);
00046 }
00047
00048 PrintFromWord::PrintFromWord
00049 ( const Word word, const HashTableGeneric& hashTable,
00050 int bitsPerSymbol, const char* tt )
00051 : pWordSeq_(0), word_( word ), length_( hashTable.getWordLength() ),
00052 bitsPerSymbol_( bitsPerSymbol ), tt_( tt ),
00053 mask_( (1 << bitsPerSymbol) - 1 )
00054 {}
00055
00056
00057 PrintFromWord::PrintFromWord
00058 ( const WordSequence& wordSeq, const HashTableGeneric& hashTable,
00059 int bitsPerSymbol, const char* tt )
00060 : pWordSeq_( &wordSeq ), length_( hashTable.getWordLength() ),
00061 bitsPerSymbol_( bitsPerSymbol ), tt_( tt ),
00062 mask_( (1 << bitsPerSymbol) - 1 )
00063 {}
00064
00065
00066
00067
00068 void PrintFromWord::doPrint( ostream& os )
00069 {
00070 if ( pWordSeq_ )
00071 {
00072 for
00073 (
00074 WordSequence::const_iterator
00075 i (pWordSeq_->begin() );
00076 i != static_cast<WordSequence::const_iterator>(&pWordSeq_->back());
00077 ++i
00078 )
00079 {
00080 doWord( os, *i );
00081 }
00082 if (pWordSeq_->size() != 0)
00083 {
00084 if (pWordSeq_->getNumBasesInLast()==0)
00085 {
00086 doWord(os, pWordSeq_->back());
00087 }
00088 else
00089 {
00090 doWord( os,
00091 (pWordSeq_->back() >>
00092 (bitsPerSymbol_*( length_
00093 - pWordSeq_->getNumBasesInLast())) ),
00094 pWordSeq_->getNumBasesInLast() );
00095 }
00096 }
00097 }
00098 else
00099 {
00100 doWord( os, word_ );
00101 }
00102 }
00103
00104 void PrintFromWord::doWord( ostream& os, const Word word, int length )
00105 {
00106 for ( int i( length - 1 ) ; i >= 0 ; i-- )
00107 {
00108
00109
00110
00111
00112
00113 os << tt_
00114 [ ( word & ( mask_ << (bitsPerSymbol_*i) ) )
00115 >> (bitsPerSymbol_*i) ];
00116 }
00117 }
00118
00119 MakeIntoWord::MakeIntoWord( int bitsPerSymbol, const char* tt ):
00120 bitsPerSymbol_( bitsPerSymbol ), tt_( tt )
00121 {
00122 for ( unsigned int i(0) ; i < (1<<bitsPerSymbol_) ; ++i )
00123 {
00124 map_.insert( make_pair( (static_cast<char>(tolower(tt[i]))),i ) );
00125 map_.insert( make_pair( (static_cast<char>(toupper(tt[i]))),i ) );
00126 };
00127 }
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 Word MakeIntoWord::operator()( const string& s )
00145 {
00146 Word w(0);
00147 if ( s.size()*bitsPerSymbol_ > (8*sizeof(Word)) ) return w;
00148 for ( unsigned int i(0) ; i < s.size() ; i++ )
00149 {
00150 w <<= bitsPerSymbol_;
00151 if (map_.find(s[i]) == map_.end() ) { w=0; break; }
00152 else w |= map_[s[i]];
00153 }
00154 return w;
00155
00156 }
00157
00158
00159
00160
00161
00162
00163 Word reverseComplement( Word word, int wordLength )
00164 {
00165 Word revComp( 0 ), mask( 0x3 );
00166 const int lim ( ( wordLength - 1 )*2 );
00167 for ( int i( 0 ) ; i <= lim ; i+=2 )
00168 {
00169 revComp |= (((word & mask)^mask) >> i) << lim - i;
00170 mask <<= 2;
00171 }
00172
00173 return revComp;
00174 }
00175
00176
00177
00178
00179
00180 void reverseComplement
00181 ( const WordSequence& seq, WordSequence& revComp,
00182 int wordLength )
00183 {
00184
00185 for ( WordSequence::const_reverse_iterator thisWord( seq.rbegin() );
00186 thisWord != seq.rend();
00187 thisWord ++ )
00188 {
00189 revComp.push_back( reverseComplement( *thisWord, wordLength ) );
00190 }
00191 shiftSequence( revComp, gBaseBits, wordLength,
00192 wordLength - seq.getNumBasesInLast() );
00193
00194 revComp.setNumBasesInLast(seq.getNumBasesInLast());
00195 }
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211 void shiftSequence
00212 ( WordSequence& sequence, int bitsPerSymbol, int wordLength, int i )
00213 {
00214 if ( sequence.size() < 1 ) return;
00215
00216 register Word oldCarry(0), thisWord;
00217 register int shiftNum( bitsPerSymbol * (wordLength - i) );
00218 register Word carryMask
00219 ( ( ( (unsigned long long)1 << (bitsPerSymbol*i) ) - 1 ) << shiftNum );
00220
00221 register Word andMask( ( (unsigned long long)1 << ( bitsPerSymbol * wordLength ) ) - 1 );
00222
00223 for (int j(sequence.size()-1); j>= 0; j--)
00224 {
00225 thisWord = sequence[j];
00226 sequence[j]
00227 = ( ( ( thisWord << (bitsPerSymbol*i) ) & andMask ) | oldCarry );
00228 oldCarry = (thisWord & carryMask) >> shiftNum ;
00229
00230
00231 }
00232
00233 }
00234
00235 void loadFromFile
00236 ( const string& fileName, const char* buffer, const unsigned long numBytes,
00237 ostream& monitoringStream_ )
00238 {
00239
00240
00241 ifstreamSSAHA inFile( fileName.c_str() );
00242
00243 if ( inFile.fail() )
00244 {
00245 monitoringStream_ << "Error: failed to open "
00246 << fileName << ", aborting load." << endl;
00247 throw SSAHAException((string)"Could not open file " + fileName);
00248 }
00249
00250 inFile.read( buffer, numBytes );
00251
00252 if (inFile.gcount() != numBytes)
00253 {
00254 monitoringStream_ << "Error: expecting " << numBytes
00255 << " bytes, but only " << inFile.gcount()
00256 << "were read.\n";
00257 throw SSAHAException("Insufficient data in file.");
00258 }
00259
00260
00261 if (inFile.peek()!=EOF)
00262 {
00263 monitoringStream_ << "Error: expecting " << numBytes
00264 << " bytes, but more were found in file.\n";
00265 throw SSAHAException("Too much data in file.");
00266 }
00267
00268
00269 monitoringStream_ << "Loaded file " << fileName << " ("
00270 << numBytes
00271 << " bytes).\n";
00272
00273 monitoringStream_ << "Closing file " << fileName << "\n";
00274 inFile.close();
00275
00276 }
00277
00278 void saveToFile
00279 ( const string& fileName, const char* buffer, const unsigned long numBytes,
00280 ostream& monitoringStream_ )
00281 {
00282
00283 ofstreamSSAHA outFile( fileName.c_str() );
00284
00285 outFile.write( buffer, numBytes );
00286
00287 if ( outFile.fail() )
00288 {
00289 monitoringStream_ << "Error: failed to write "
00290 << fileName << ", aborting save." << endl;
00291 throw SSAHAException((string)"Problem saving file " + fileName);
00292 }
00293
00294 monitoringStream_ << "Saved file " << fileName << "." << endl;
00295
00296 outFile.close();
00297
00298 }
00299
00300
00301 #ifdef USING_POSIX_MEMORY_MAPPING
00302
00303 const MemoryMapper::Mode MemoryMapper::createMap =
00304 MemoryMapper::Mode
00305 ( O_CREAT|O_EXCL|O_RDWR,PROT_READ|PROT_WRITE,MAP_SHARED, true, true );
00306
00307 const MemoryMapper::Mode MemoryMapper::readMap =
00308 MemoryMapper::Mode
00309
00310 ( O_RDONLY,PROT_READ,MAP_PRIVATE, false, false );
00311
00312
00313
00314 void* MemoryMapper::linkToMap
00315 ( const Mode& mode, const string& name, unsigned long numBytes )
00316 {
00317
00318
00319
00320 static const int shareMode = S_IRWXO|S_IRWXG|S_IRWXU;
00321
00322
00323
00324 fileDesc_ = shm_open(name.c_str(), mode.shared, shareMode);
00325 if(fileDesc_ < 0)
00326 {
00327 throw SSAHAException("Failed to open shared memory");
00328 }
00329
00330
00331
00332 if (mode.truncateFile==true)
00333 {
00334 if((ftruncate(fileDesc_, numBytes)) == -1)
00335 {
00336 throw SSAHAException("Failed to truncate shared memory file");
00337 }
00338 }
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352 return mmap(0, numBytes, mode.access, mode.flags, fileDesc_, 0);
00353
00354
00355 }
00356
00357 #endif
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369