From b5a1044263fb261cd74e8c8d193a86e95cc0c891 Mon Sep 17 00:00:00 2001 From: mohamadi Date: Wed, 5 Sep 2018 10:19:10 -0700 Subject: [PATCH] nthash.hpp: added slide left functions --- nthash.hpp | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/nthash.hpp b/nthash.hpp index cd869aa..905b4ec 100644 --- a/nthash.hpp +++ b/nthash.hpp @@ -165,6 +165,37 @@ inline uint64_t NTC64(const unsigned char charOut, const unsigned char charIn, c return (rhVal> 33; + uint64_t rBits = seedTab[charIn] & 0x1FFFFFFFF; + uint64_t sIn = (rol31(lBits,k) << 33) | (rol33(rBits,k)); + uint64_t hVal = rhVal ^ sIn; + hVal ^= seedTab[charOut]; + hVal = ror1(hVal); + hVal = swapbits3263(hVal); + return hVal; +} + +// reverse-complement ntHash for sliding k-mers to the left +inline uint64_t NTR64L(const uint64_t fhVal, const unsigned k, const unsigned char charOut, const unsigned char charIn) { + uint64_t hVal = rol1(fhVal); + hVal = swapbits033(hVal); + hVal ^= seedTab[charIn&cpOff]; + uint64_t lBits = seedTab[charOut&cpOff] >> 33; + uint64_t rBits = seedTab[charOut&cpOff] & 0x1FFFFFFFF; + uint64_t sOut = (rol31(lBits,k) << 33) | (rol33(rBits,k)); + hVal ^= sOut; + return hVal; +} + +// canonical ntHash for sliding k-mers to the left +inline uint64_t NTC64L(const unsigned char charOut, const unsigned char charIn, const unsigned k, uint64_t& fhVal, uint64_t& rhVal) { + fhVal = NTF64L(fhVal, k, charOut, charIn); + rhVal = NTR64L(rhVal, k, charOut, charIn); + return (rhVal=0; i--) { + if(seedTab[(unsigned char)kmerSeq[i]]==seedN) { + locN=i; + return false; + } + fhVal = rol1(fhVal); + fhVal = swapbits033(fhVal); + fhVal ^= seedTab[(unsigned char)kmerSeq[k-1-i]]; + + rhVal = rol1(rhVal); + rhVal = swapbits033(rhVal); + rhVal ^= seedTab[(unsigned char)kmerSeq[i]&cpOff]; + } + hStn = rhVal> multiShift; + hVal[i] = tVal; + } + return true; +} + +// starnd-aware canonical multihash ntHash for sliding k-mers +inline void NTMC64(const unsigned char charOut, const unsigned char charIn, const unsigned k, const unsigned m, uint64_t& fhVal, uint64_t& rhVal, uint64_t *hVal, bool &hStn) { + uint64_t bVal=0, tVal=0; + bVal = NTC64(charOut, charIn, k, fhVal, rhVal); + hStn = rhVal> multiShift; + hVal[i] = tVal; + } +} + #endif