;
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 voidCollapseOnDepth(
size_tCollapseDepth);
69 size_tMinDepthForRange(
TSeqRangeCheckRange)
const;
73 voidCalcStats()
const;
76 ITERATE(vector<SRangeDepth>, RangeIter, x_Ranges) {
77cerr << RangeIter->Range <<
" : "<< RangeIter->Depth << endl;
88 if(x_Ranges.empty()) {
90x_Ranges.push_back(NewRangeDepth);
94vector<SRangeDepth> News;
97 ERASE_ITERATE(vector<SRangeDepth>, RangeDepthIter, x_Ranges) {
99 if(RemainRange.
Empty()) {
103 if( RangeDepthIter->Range == RemainRange) {
104RangeDepthIter->Depth++;
110 if(RemainRange.
GetTo() < RangeDepthIter->Range.GetFrom()) {
114 boolEraseCurr =
false;
118 SRangeDepthInterRangeDepth(Inter, RangeDepthIter->Depth + 1);
119News.push_back(InterRangeDepth);
128News.push_back(NewPrev);
130 if(RemainRange.
GetTo() >= Inter.
GetTo()) {
134RemainRange = NewAfterRange;
137 if(RangeDepthIter->Range.GetFrom() < Inter.
GetFrom()) {
139OldPrevRange.
SetFrom(RangeDepthIter->Range.GetFrom());
141 SRangeDepthOldPrev(OldPrevRange, RangeDepthIter->Depth);
142News.push_back(OldPrev);
144 if(RangeDepthIter->Range.GetTo() > Inter.
GetTo()) {
147OldAfterRange.
SetTo(RangeDepthIter->Range.GetTo());
148 SRangeDepthOldAfter(OldAfterRange, RangeDepthIter->Depth);
149News.push_back(OldAfter);
162x_Ranges.push_back(RemainRangeDepth);
166x_Ranges.insert(x_Ranges.end(), News.begin(), News.end());
167 sort(x_Ranges.begin(), x_Ranges.end());
173vector<SRangeDepth> Result;
175 ITERATE(vector<SRangeDepth>, RangeDepthIter, x_Ranges) {
179 if(Result.empty() ||
180!RangeDepthIter->Range.AbuttingWith( Result.back().Range )) {
181Result.push_back(*RangeDepthIter);
186 if((Result.back().Depth <= CollapseDepth) ^
187(RangeDepthIter->Depth <= CollapseDepth)) {
188Result.push_back(*RangeDepthIter);
193Result.back().Depth =
min(Result.back().Depth, RangeDepthIter->Depth);
194Result.back().Range += RangeDepthIter->Range;
197x_Ranges.swap(Result);
198 sort(x_Ranges.begin(), x_Ranges.end());
205 ITERATE(vector<SRangeDepth>, RangeIter, x_Ranges) {
207Result =
min(Result, RangeIter->Depth);
215vector<SRangeDepth> News;
218 ITERATE(vector<SRangeDepth>, RangeIter, x_Ranges) {
220 if(Prev != RangeIter->Range &&
224Zero.
SetTo(RangeIter->Range.GetFrom()-1);
226News.push_back(ZeroRD);
228Prev = RangeIter->Range;
231x_Ranges.insert(x_Ranges.end(), News.begin(), News.end());
232 sort(x_Ranges.begin(), x_Ranges.end());
237 size_tAccumBases = 0;
238 size_tAccumBaseDepth = 0;
239 size_tAccumRangeDepth = 0;
240 size_tRangeCount = 0;
242vector<size_t> SortBaseDepths;
243vector<size_t> SortRangeDepths;
246 ITERATE(vector<SRangeDepth>, RangeDepthIter, x_Ranges) {
247AccumBases += RangeDepthIter->Range.GetLength();
248AccumBaseDepth += (RangeDepthIter->Range.GetLength() * RangeDepthIter->Depth);
249AccumRangeDepth += RangeDepthIter->Depth;
252 for(
size_t i= 0;
i< RangeDepthIter->Range.GetLength();
i++) {
253SortBaseDepths.push_back(RangeDepthIter->Depth);
255SortRangeDepths.push_back(RangeDepthIter->Depth);
258 doubleBaseMean = (double(AccumBaseDepth) / double(AccumBases));
259 doubleRangeMean = (double(AccumRangeDepth) / double(RangeCount));
261 sort(SortBaseDepths.begin(), SortBaseDepths.end());
262 sort(SortRangeDepths.begin(), SortRangeDepths.end());
264 size_tBaseMedian = SortBaseDepths[SortBaseDepths.size()/2];
265 size_tRangeMedian = SortRangeDepths[SortRangeDepths.size()/2];
267 size_tPrevValue = SortRangeDepths.front();
268 size_tPrevCounts = 0;
269 size_tBestValue=PrevValue, BestCounts=0;
270 ITERATE(vector<size_t>, ValueIter, SortRangeDepths) {
271 if( (*ValueIter) == PrevValue) {
274 if(PrevCounts > BestCounts) {
275BestValue = PrevValue;
276BestCounts = PrevCounts;
278PrevValue = *ValueIter;
282 size_tRangeMode = BestValue;
284PrevValue = SortBaseDepths.front();
286BestValue=PrevValue, BestCounts=0;
287 ITERATE(vector<size_t>, ValueIter, SortBaseDepths) {
288 if( (*ValueIter) == PrevValue) {
291 if(PrevCounts > BestCounts) {
292BestValue = PrevValue;
293BestCounts = PrevCounts;
295PrevValue = *ValueIter;
299 size_tBaseMode = BestValue;
302cerr <<
"BaseMean: "<< BaseMean << endl;
303cerr <<
"RangeMean: "<< RangeMean << endl;
304cerr <<
"BaseMedian: "<< BaseMedian << endl;
305cerr <<
"RangeMedian: "<< RangeMedian << endl;
306cerr <<
"BaseMode: "<< BaseMode << endl;
307cerr <<
"RangeMode: "<< RangeMode << endl;
320 doublePctIdentRescue)
330 TSeqRangeRange = (*AlignIter)->GetSeqRange(FilterOnRow);
342 TSeqRangeRange = (*AlignIter)->GetSeqRange(FilterOnRow);
346 if(CurrDepth <= DepthCutoff) {
347Output.push_back(*AlignIter);
351 doublePctIdentUngap = 0.0;
357 TSeqPosAlignLen = (*AlignIter)->GetAlignLength(
false);
358PctIdentUngap = (double(NumIdent) / AlignLen) * 100.0;
362 if(PctIdentUngap >= PctIdentRescue) {
363Output.push_back(*AlignIter);
374 size_tDepthCutoff,
doublePctIdentRescue)
378FilterOneRow(Input, FilteredQ, 0, DepthCutoff, PctIdentRescue);
379FilterOneRow(Input, FilteredS, 1, DepthCutoff, PctIdentRescue);
383TAlignList::const_iterator AlignIterQ = FilteredQ.begin(),
384EndQ = FilteredQ.end();
385TAlignList::const_iterator AlignIterS = FilteredS.begin(),
386EndS = FilteredS.end();
389 if(AlignIterQ == EndQ || AlignIterS == EndS)
break;
391 if(*AlignIter == *AlignIterQ && *AlignIter == *AlignIterS) {
392Output.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.
constexpr auto sort(_Init &&init)
Magic spell ;-) needed for some weird compilers... very empiric.
SRangeDepth(TSeqRange range)
SRangeDepth(TSeqRange range, size_t depth)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4