TrimSequence.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef _TRIMSEQUENCE_H
00019 #define _TRIMSEQUENCE_H
00020
00021 #include <assert.h>
00022 #include <stdint.h>
00023 #include <stdlib.h>
00024 #include <unistd.h>
00025
00060 template<typename sequenceType, typename meanValueType>
00061 typename sequenceType::iterator trimSequence(sequenceType &sequence, meanValueType meanValue, const bool trimFromLeft)
00062 {
00063 const int howManyValues = 4;
00064 int windowThreshold = howManyValues * meanValue;
00065 int64_t sumOfWindow = 0;
00066 typename sequenceType::iterator it;
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 if (sequence.size() < (size_t) howManyValues)
00077 return trimFromLeft? sequence.begin() : sequence.end();
00078
00079 typename sequenceType::iterator sequenceBegin;
00080 typename sequenceType::iterator sequenceEnd;
00081
00082
00083
00084
00085 if (trimFromLeft)
00086 {
00087
00088 sequenceBegin = sequence.begin();
00089 sequenceEnd = sequence.end();
00090
00091 for (it = sequenceBegin; it < sequenceBegin + howManyValues; it++)
00092 sumOfWindow += *it;
00093
00094 for (; it < sequenceEnd; it ++)
00095 {
00096 if (sumOfWindow > windowThreshold)
00097 break;
00098 sumOfWindow += *it;
00099 sumOfWindow -= *(it - howManyValues);
00100 }
00101
00102
00103 while (*(it-1) >= meanValue && (it-1) >= sequenceBegin)
00104 it--;
00105 }
00106 else
00107 {
00108 sequenceBegin = sequence.end() - 1;
00109 sequenceEnd = sequence.begin() - 1;
00110
00111 for (it = sequenceBegin; it > sequenceBegin - howManyValues; it--)
00112 sumOfWindow += *it;
00113
00114 for (; it > sequenceEnd; it--)
00115 {
00116 if (sumOfWindow > windowThreshold)
00117 break;
00118 sumOfWindow += *it;
00119 sumOfWindow -= *(it + howManyValues);
00120 }
00121
00122
00123
00124 while (*(it+1) >= meanValue && (it+1) <= sequenceBegin)
00125 it ++;
00126
00127 it += 1;
00128 }
00129
00130
00131 assert(it >= sequence.begin() && it <= sequence.end());
00132
00133 return it;
00134 }
00135
00136 #endif