@@ -181,6 +181,14 @@ void helperReportMem(uint64_t &currRPos, uint64_t &currQPos, uint64_t totalRBits
181181 }else {
182182 lRef-=matchSize;
183183 lQue-=matchSize;
184+ if (matchSize > static_cast <uint64_t >(commonData::maxMemLen)) {
185+ if (lRef?(lRef - RefNpos.left <= commonData::lenBuffer):!lRef) {
186+ rRMEM = RefNpos.right ;
187+ lRMEM = RefNpos.left ;
188+ }
189+ return ;
190+ }
191+
184192 if (mismatch) {
185193 if (matchSize==2 )
186194 break ;
@@ -190,6 +198,18 @@ void helperReportMem(uint64_t &currRPos, uint64_t &currQPos, uint64_t totalRBits
190198 }
191199 }
192200
201+ /* Ignore reverse complements of the same ORF, i.e. where matching prefix/suffix of reference/query
202+ * Also excludes N mismatches
203+ */
204+ if (lRef?(lRef - RefNpos.left <= commonData::lenBuffer):!lRef) {
205+ rRMEM = RefNpos.right ;
206+ lRMEM = RefNpos.left ;
207+ return ;
208+ }
209+
210+ if (lQue?(lQue - QueryNpos.left <= commonData::lenBuffer):!lQue)
211+ return ;
212+
193213 if (totalRBits-lRef+2 < static_cast <uint64_t >(commonData::minMemLen))
194214 return ;
195215
@@ -259,9 +279,25 @@ void helperReportMem(uint64_t &currRPos, uint64_t &currQPos, uint64_t totalRBits
259279 currQ <<= matchSize;
260280 rRef+=matchSize;
261281 rQue+=matchSize;
282+ if (matchSize > static_cast <uint64_t >(commonData::maxMemLen)) {
283+ if ((RefNpos.right - rRef) <= commonData::lenBuffer) {
284+ rRMEM = RefNpos.right ;
285+ lRMEM = RefNpos.left ;
286+ }
287+ return ;
288+ }
262289 }
263290 } // loop until extension reached to the right
264291
292+ if ((RefNpos.right - rRef) <= commonData::lenBuffer) {
293+ rRMEM = RefNpos.right ;
294+ lRMEM = RefNpos.left ;
295+ return ;
296+ }
297+
298+ if ((QueryNpos.right - rQue) <= commonData::lenBuffer)
299+ return ;
300+
265301 /* Adjust rRef and rQue locations */
266302
267303 if (rRef > RefNpos.right ){
@@ -282,32 +318,22 @@ void helperReportMem(uint64_t &currRPos, uint64_t &currQPos, uint64_t totalRBits
282318 rQue=totalQBits;
283319 }
284320
285- /* Ignore reverse complements of the same ORF, i.e. where matching prefix/suffix of reference/query
286- * Also excludes N mismatches
287- */
288- if ((lRef?(lRef - RefNpos.left <= commonData::lenBuffer):!lRef) || ((RefNpos.right - rRef) <= commonData::lenBuffer)) {
321+ if (((RefNpos.right - rRef) <= commonData::lenBuffer) || (lRef?(lRef - RefNpos.left <= commonData::lenBuffer):!lRef)) {
289322 rRMEM = RefNpos.right ;
290323 lRMEM = RefNpos.left ;
291324 return ;
292- }
293-
294- /* if current rRef/rQue plus matchSize smaller than minMEMLength, then simply return.
295- * Note that one less character is compared due to a mismatch
296- */
297- if ((rRef-lRef < static_cast <uint64_t >(commonData::minMemLen)) || (rRef-lRef > static_cast <uint64_t >(commonData::maxMemLen))) {
298- if ((lRef?(lRef - RefNpos.left <= commonData::lenBuffer):!lRef) || ((RefNpos.right - rRef) <= commonData::lenBuffer)) {
299- rRMEM = RefNpos.right ;
300- lRMEM = RefNpos.left ;
301- }
302- return ;
303- }
304-
305- if (!((lQue?(lQue - QueryNpos.left <= commonData::lenBuffer):!lQue) || ((QueryNpos.right + 2 - rQue) <= commonData::lenBuffer))) {
306- lQtmp = ((QueryNpos.left == 1 )?(QueryNpos.left + (QueryNpos.right - rQue) - 1 ):(QueryNpos.left + (QueryNpos.right - rQue)));
307- rQtmp = ((QueryNpos.left == 1 )?(QueryNpos.left + (QueryNpos.right - lQue) - 1 ):(QueryNpos.left + (QueryNpos.right - lQue)));
308- arrayTmpFile.getInvertedRepeats (lQtmp, rQtmp, QueryFile, rRef, lRef, RefFile, vecSeqInfo);
309- rQMEM = QueryNpos.right ;
310325 }
326+
327+ if (((QueryNpos.right - rQue) <= commonData::lenBuffer) || (lQue?(lQue - QueryNpos.left <= commonData::lenBuffer):!lQue))
328+ return ;
329+
330+ if (rRef-lRef > static_cast <uint64_t >(commonData::maxMemLen) || rRef-lRef < static_cast <uint64_t >(commonData::minMemLen))
331+ return ;
332+
333+ lQtmp = ((QueryNpos.left == 1 )?(QueryNpos.left + (QueryNpos.right - rQue) - 1 ):(QueryNpos.left + (QueryNpos.right - rQue)));
334+ rQtmp = ((QueryNpos.left == 1 )?(QueryNpos.left + (QueryNpos.right - lQue) - 1 ):(QueryNpos.left + (QueryNpos.right - lQue)));
335+ arrayTmpFile.getInvertedRepeats (lQtmp, rQtmp, QueryFile, rRef, lRef, RefFile, vecSeqInfo);
336+ rQMEM = QueryNpos.right ;
311337}
312338
313339void reportMEM (Knode* &refHash, uint64_t totalBases, uint64_t totalQBases, seqFileReadInfo &RefFile, seqFileReadInfo &QueryFile, tmpFilesInfo &arrayTmpFile, vector<seqData> &vecSeqInfo)
@@ -494,7 +520,7 @@ void checkCommandLineOptions(uint32_t &options)
494520void print_help_msg ()
495521{
496522 cout << endl;
497- cout << " pal-MEM Version 2.1.0, Mar. 7, 2021 " << endl;
523+ cout << " pal-MEM Version 2.3.4, Feb. 26, 2022 " << endl;
498524 cout << " Adapted from E-MEM Version 1.0.2, Dec. 12, 2017, by Nilesh Khiste and Lucian Ilie" << endl;
499525 cout << endl;
500526 cout << " pal-MEM outputs two fasta files and a tab-delimited file. One fasta file contains reads" << endl;
0 commit comments