54 if(
A.Range.GetFrom() !=
B.Range.GetFrom())
55 return A.Range.GetFrom() <
B.Range.GetFrom();
57 return A.Range.GetTo() <
B.Range.GetTo();
67 void CollapseOnDepth(
size_t CollapseDepth);
69 size_t MinDepthForRange(
TSeqRange CheckRange)
const;
73 void CalcStats()
const;
76 ITERATE(vector<SRangeDepth>, RangeIter, x_Ranges) {
77 cerr << RangeIter->Range <<
" : " << RangeIter->Depth << endl;
88 if(x_Ranges.empty()) {
90 x_Ranges.push_back(NewRangeDepth);
94 vector<SRangeDepth> News;
97 ERASE_ITERATE(vector<SRangeDepth>, RangeDepthIter, x_Ranges) {
99 if(RemainRange.
Empty()) {
103 if( RangeDepthIter->Range == RemainRange) {
104 RangeDepthIter->Depth++;
110 if(RemainRange.
GetTo() < RangeDepthIter->Range.GetFrom()) {
114 bool EraseCurr =
false;
118 SRangeDepth InterRangeDepth(Inter, RangeDepthIter->Depth + 1);
119 News.push_back(InterRangeDepth);
128 News.push_back(NewPrev);
134 RemainRange = NewAfterRange;
137 if(RangeDepthIter->Range.GetFrom() < Inter.
GetFrom()) {
139 OldPrevRange.
SetFrom(RangeDepthIter->Range.GetFrom());
141 SRangeDepth OldPrev(OldPrevRange, RangeDepthIter->Depth);
142 News.push_back(OldPrev);
144 if(RangeDepthIter->Range.GetTo() > Inter.
GetTo()) {
147 OldAfterRange.
SetTo(RangeDepthIter->Range.GetTo());
148 SRangeDepth OldAfter(OldAfterRange, RangeDepthIter->Depth);
149 News.push_back(OldAfter);
162 x_Ranges.push_back(RemainRangeDepth);
166 x_Ranges.insert(x_Ranges.end(), News.begin(), News.end());
167 sort(x_Ranges.begin(), x_Ranges.end());
173 vector<SRangeDepth> Result;
175 ITERATE(vector<SRangeDepth>, RangeDepthIter, x_Ranges) {
179 if (Result.empty() ||
180 !RangeDepthIter->Range.AbuttingWith( Result.back().Range )) {
181 Result.push_back(*RangeDepthIter);
186 if ((Result.back().Depth <= CollapseDepth) ^
187 (RangeDepthIter->Depth <= CollapseDepth)) {
188 Result.push_back(*RangeDepthIter);
193 Result.back().Depth =
min(Result.back().Depth, RangeDepthIter->Depth);
194 Result.back().Range += RangeDepthIter->Range;
197 x_Ranges.swap(Result);
198 sort(x_Ranges.begin(), x_Ranges.end());
205 ITERATE(vector<SRangeDepth>, RangeIter, x_Ranges) {
207 Result =
min(Result, RangeIter->Depth);
215 vector<SRangeDepth> News;
218 ITERATE(vector<SRangeDepth>, RangeIter, x_Ranges) {
220 if (Prev != RangeIter->Range &&
224 Zero.
SetTo(RangeIter->Range.GetFrom()-1);
226 News.push_back(ZeroRD);
228 Prev = RangeIter->Range;
231 x_Ranges.insert(x_Ranges.end(), News.begin(), News.end());
232 sort(x_Ranges.begin(), x_Ranges.end());
237 size_t AccumBases = 0;
238 size_t AccumBaseDepth = 0;
239 size_t AccumRangeDepth = 0;
240 size_t RangeCount = 0;
242 vector<size_t> SortBaseDepths;
243 vector<size_t> SortRangeDepths;
246 ITERATE(vector<SRangeDepth>, RangeDepthIter, x_Ranges) {
247 AccumBases += RangeDepthIter->Range.GetLength();
248 AccumBaseDepth += (RangeDepthIter->Range.GetLength() * RangeDepthIter->Depth);
249 AccumRangeDepth += RangeDepthIter->Depth;
252 for(
size_t i = 0;
i < RangeDepthIter->Range.GetLength();
i++) {
253 SortBaseDepths.push_back(RangeDepthIter->Depth);
255 SortRangeDepths.push_back(RangeDepthIter->Depth);
258 double BaseMean = (double(AccumBaseDepth) / double(AccumBases));
259 double RangeMean = (double(AccumRangeDepth) / double(RangeCount));
261 sort(SortBaseDepths.begin(), SortBaseDepths.end());
262 sort(SortRangeDepths.begin(), SortRangeDepths.end());
264 size_t BaseMedian = SortBaseDepths[SortBaseDepths.size()/2];
265 size_t RangeMedian = SortRangeDepths[SortRangeDepths.size()/2];
267 size_t PrevValue = SortRangeDepths.front();
268 size_t PrevCounts = 0;
269 size_t BestValue=PrevValue, BestCounts=0;
270 ITERATE(vector<size_t>, ValueIter, SortRangeDepths) {
271 if( (*ValueIter) == PrevValue) {
274 if(PrevCounts > BestCounts) {
275 BestValue = PrevValue;
276 BestCounts = PrevCounts;
278 PrevValue = *ValueIter;
282 size_t RangeMode = BestValue;
284 PrevValue = SortBaseDepths.front();
286 BestValue=PrevValue, BestCounts=0;
287 ITERATE(vector<size_t>, ValueIter, SortBaseDepths) {
288 if( (*ValueIter) == PrevValue) {
291 if(PrevCounts > BestCounts) {
292 BestValue = PrevValue;
293 BestCounts = PrevCounts;
295 PrevValue = *ValueIter;
299 size_t BaseMode = BestValue;
302 cerr <<
"BaseMean: " << BaseMean << endl;
303 cerr <<
"RangeMean: " << RangeMean << endl;
304 cerr <<
"BaseMedian: " << BaseMedian << endl;
305 cerr <<
"RangeMedian: " << RangeMedian << endl;
306 cerr <<
"BaseMode: " << BaseMode << endl;
307 cerr <<
"RangeMode: " << RangeMode << endl;
320 double PctIdentRescue)
330 TSeqRange Range = (*AlignIter)->GetSeqRange(FilterOnRow);
342 TSeqRange Range = (*AlignIter)->GetSeqRange(FilterOnRow);
346 if(CurrDepth <= DepthCutoff) {
347 Output.push_back(*AlignIter);
351 double PctIdentUngap = 0.0;
357 TSeqPos AlignLen = (*AlignIter)->GetAlignLength(
false);
358 PctIdentUngap = (double(NumIdent) / AlignLen) * 100.0;
362 if(PctIdentUngap >= PctIdentRescue) {
363 Output.push_back(*AlignIter);
374 size_t DepthCutoff,
double PctIdentRescue)
378 FilterOneRow(Input, FilteredQ, 0, DepthCutoff, PctIdentRescue);
379 FilterOneRow(Input, FilteredS, 1, DepthCutoff, PctIdentRescue);
383 TAlignList::const_iterator AlignIterQ = FilteredQ.begin(),
384 EndQ = FilteredQ.end();
385 TAlignList::const_iterator AlignIterS = FilteredS.begin(),
386 EndS = FilteredS.end();
389 if (AlignIterQ == EndQ || AlignIterS == EndS)
break;
391 if (*AlignIter == *AlignIterQ && *AlignIter == *AlignIterS) {
392 Output.push_back(*AlignIter);
395 if (*AlignIter == *AlignIterQ) ++AlignIterQ;
396 if (*AlignIter == *AlignIterS) ++AlignIterS;
static void FilterOneRow(const list< CRef< objects::CSeq_align > > &Input, list< CRef< objects::CSeq_align > > &Output, int FilterOnRow, size_t DepthCutoff=5, double PctIdentRescue=95.0)
static void FilterBothRows(const list< CRef< objects::CSeq_align > > &Input, list< CRef< objects::CSeq_align > > &Output, size_t DepthCutoff=5, double PctIdentRescue=95.0)
void CollapseOnDepth(size_t CollapseDepth)
vector< SRangeDepth > x_Ranges
void AddRange(TSeqRange NewRange)
size_t MinDepthForRange(TSeqRange CheckRange) const
@ eScore_PercentIdentity_Ungapped
static unsigned char depth[2 *(256+1+29)+1]
bool operator<(const SRangeDepth &A, const SRangeDepth &B)
list< CRef< CSeq_align > > TAlignList
unsigned int TSeqPos
Type for sequence locations and lengths.
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
#define ERASE_ITERATE(Type, Var, Cont)
Non-constant version with ability to erase current element, if container permits.
#define VECTOR_ERASE(Var, Cont)
Use this macro inside body of ERASE_ITERATE cycle to erase from vector-like container.
bool NotEmpty(void) const
bool AbuttingWith(const TThisType &r) const
bool IntersectingWith(const TThisType &r) const
TThisType IntersectionWith(const TThisType &r) const
CRange< TSeqPos > TSeqRange
typedefs for sequence ranges
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
void SetFrom(TFrom value)
Assign a value to From data member.
TTo GetTo(void) const
Get the To member data.
TFrom GetFrom(void) const
Get the From member data.
void SetTo(TTo value)
Assign a value to To data member.
range(_Ty, _Ty) -> range< _Ty >
constexpr auto sort(_Init &&init)
Magic spell ;-) needed for some weird compilers... very empiric.
SRangeDepth(TSeqRange range)
SRangeDepth(TSeqRange range, size_t depth)