AlignIds.
insert(EquivIter->AlignId);
69 size_tMisMatches = 0;
71Matches += EquivIter->Matches;
72MisMatches += EquivIter->MisMatches;
78 size_tMisMatches = 0;
80Matches += EquivIter->Matches;
81MisMatches += EquivIter->MisMatches;
83 returnMatches+MisMatches;
88 if(
A->GetSeqStart(0) !=
B->GetSeqStart(0))
89 return(
A->GetSeqStart(0) <
B->GetSeqStart(0));
90 else if(
A->GetSeqStop(0) !=
B->GetSeqStop(0))
91 return(
A->GetSeqStop(0) <
B->GetSeqStop(0));
92 else if(
A->GetSeqStart(1) !=
B->GetSeqStart(1))
93 return(
A->GetSeqStart(1) <
B->GetSeqStart(1));
94 else if(
A->GetSeqStop(1) !=
B->GetSeqStop(1))
95 return(
A->GetSeqStop(1) <
B->GetSeqStop(1));
97 return A->GetSeqStrand(0) <
B->GetSeqStrand(0);
102 if(
A->GetSeqStart(0) !=
B->GetSeqStart(0))
103 return(
A->GetSeqStart(0) >
B->GetSeqStart(0));
104 else if(
A->GetSeqStop(0) !=
B->GetSeqStop(0))
105 return(
A->GetSeqStop(0) >
B->GetSeqStop(0));
106 else if(
A->GetSeqStart(1) !=
B->GetSeqStart(1))
107 return(
A->GetSeqStart(1) <
B->GetSeqStart(1));
108 else if(
A->GetSeqStop(1) !=
B->GetSeqStop(1))
109 return(
A->GetSeqStop(1) <
B->GetSeqStop(1));
111 return A->GetSeqStrand(0) <
B->GetSeqStrand(0);
119InterA =
int(
A.GetSeqStart(1)) -
int(
A.GetSeqStart(0));
121InterA =
A.GetSeqStop(1) +
A.GetSeqStart(0);
132 return(InterA < InterB);
137 return(
A->GetAlignLength(
false) <
B->GetAlignLength(
false));
143TEquivList::const_iterator AI, BI;
144TEquivList::const_iterator AE, BE;
153 if(AI == AE || BI == BE) {
157 if(AI->Query == BI->Query && AI->Subjt == BI->Subjt) {
163 if(AI->Query.GetFrom() < BI->Query.GetFrom()) {
164 #ifdef MERGE_TREE_VERBOSE_DEBUG 165cerr <<
" < "<< *AI << endl;
170 else if(BI->Query.GetFrom() < AI->Query.GetFrom()) {
171 #ifdef MERGE_TREE_VERBOSE_DEBUG 172cerr <<
" > "<< *BI << endl;
178 if(AI->Subjt.GetFrom() < BI->Subjt.GetFrom()) {
179 #ifdef MERGE_TREE_VERBOSE_DEBUG 180cerr <<
" < "<< *AI << endl;
185 else if(BI->Subjt.GetFrom() < AI->Subjt.GetFrom()) {
186 #ifdef MERGE_TREE_VERBOSE_DEBUG 187cerr <<
" > "<< *BI << endl;
193 #ifdef MERGE_TREE_VERBOSE_DEBUG 194cerr <<
" < "<< *AI << endl;
195cerr <<
" > "<< *BI << endl;
206 #ifdef MERGE_TREE_VERBOSE_DEBUG 207cerr <<
" > "<< *AI << endl;
212 #ifdef MERGE_TREE_VERBOSE_DEBUG 213cerr <<
" < "<< *BI << endl;
251 return max(
D, DeltaInt);
261 #ifdef MERGE_TREE_VERBOSE_DEBUG 269 for(L=0; L < (
int)
Path.size(); L++) {
270CurrPath.push_back(
Path[L] );
271 intCurrScore = Tree.
Score(CurrPath);
272 if(CurrScore >= BestScore) {
274BestScore = CurrScore;
280 for(
F=
BL;
F>= 0;
F--) {
281CurrPath.insert(CurrPath.begin(),
Path[
F]);
282 intCurrScore = Tree.
Score(CurrPath);
283 if(CurrScore >= BestScore) {
284 #ifdef MERGE_TREE_VERBOSE_DEBUG 287BestScore = CurrScore;
292 #ifdef MERGE_TREE_VERBOSE_DEBUG 293 if(
BF> 0 ||
BL< (
int)(
Path.size()-1) ) {
294cerr <<
"s_FindBestSubRange : "<<
BF<<
" : "<<
BL<<
" : "<< BestScore <<
" of "<<
Path.size()-1 << endl;
311 typedefpair<CSeq_id_Handle, ENa_strand>
TSeqIdPair;
312 typedefpair<TSeqIdPair, TSeqIdPair>
TMapKey;
313 typedefvector<CRef<CSeq_align> >
TAlignVec;
326AlignMap[Key].push_back(*AlignIter);
336 ITERATE(TAlignMap, MapIter, AlignMap) {
342QueryBSH =
m_Scope->GetBioseqHandle(QueryIDH);
343SubjtBSH =
m_Scope->GetBioseqHandle(SubjtIDH);
350 #ifdef MERGE_TREE_VERBOSE_DEBUG 351cerr << AID <<
"\t"<< (*AlignIter)->GetSeqRange(0)
352<<
"\t"<< (*AlignIter)->GetSeqRange(1) << endl;
357 #ifdef MERGE_TREE_VERBOSE_DEBUG 358cerr <<
"OrigEquivs; "<< OrigEquivs.size() << endl;
362 if(QueryBSH && SubjtBSH) {
363EquivRangeBuilder.
CalcMatches(QueryBSH, SubjtBSH, OrigEquivs);
366Iter->Matches = Iter->Query.GetLength();
367Iter->MisMatches = 0;
375CRangeCollection<TSeqPos> QRC, SRC;
376CRangeCollection<TSeqPos> DQRC, DSRC;
377ITERATE(TEquivList, Iter, OrigEquivs) {
378if(QRC.IntersectingWith(Iter->Query)) {
379CRangeCollection<TSeqPos> T(Iter->Query);
380T.IntersectWith(QRC);
383if(SRC.IntersectingWith(Iter->Subjt)) {
384CRangeCollection<TSeqPos> T(Iter->Subjt);
385T.IntersectWith(SRC);
391CRangeCollection<TSeqPos> NQRC, NSRC;
392NQRC += QRC.GetLimits();
393NSRC += SRC.GetLimits();
397vector<TSeqPos> RQs, RSs;
398RQs.push_back(QRC.GetFrom());
399ITERATE(CRangeCollection<TSeqPos>, Iter, NQRC) {
400RQs.push_back(Iter->GetFrom());
401RQs.push_back(Iter->GetTo());
402cerr << "QZ: " << *Iter << endl;
404RQs.push_back(QRC.GetTo()+1);
405RSs.push_back(SRC.GetFrom());
406ITERATE(CRangeCollection<TSeqPos>, Iter, NSRC) {
407RSs.push_back(Iter->GetFrom());
408RSs.push_back(Iter->GetTo());
409cerr << "SZ: " << *Iter << endl;
411RSs.push_back(SRC.GetTo()+1);
413vector<TSeqPos>::iterator NE;
414sort(RQs.begin(), RQs.end());
415NE = unique(RQs.begin(), RQs.end());
416RQs.erase(NE, RQs.end());
417sort(RSs.begin(), RSs.end());
418NE = unique(RSs.begin(), RSs.end());
419RSs.erase(NE, RSs.end());
423CMergeTree::SScoring QuadScoring;
424QuadScoring.GapExtend = 0;
426ITERATE(TEquivList, Iter, OrigEquivs) {
427QR.CombineWith(Iter->Query);
428SR.CombineWith(Iter->Subjt);
430cerr << QR << "\t" << SR << endl;
431CQuadTree QT(64, QR, SR);
432QT.SetRecs(RQs, RSs);
433ITERATE(TEquivList, Iter, OrigEquivs) {
438int NodesVisited = 0;
440NON_CONST_ITERATE(CQuadTree, QuadIter, QT) {
443if(!QuadIter->IsLeaf)
446if(QuadIter->Storage.empty())
449set<int> AlignIds = s_AlignIdsFromEquivList(QuadIter->Storage);
450cerr << QuadIter->XR << "\t" << QuadIter->YR
451<< "\t" << QuadIter->Depth
452<< "\t" << QuadIter->Storage.size()
453<< "\t" << AlignIds.size()
454<< "\t" << s_ScoreFromEquivList(QuadIter->Storage)
456ITERATE(set<int>, AlignIdIter, AlignIds) {
457cerr << "\t" << *AlignIdIter;
461TEquivList LocalSplits;
462EquivRangeBuilder.SplitIntersections(QuadIter->Storage, LocalSplits);
463QuadIter->Storage.clear();
466Tree.SetScoring(QuadScoring); //m_Scoring);
467Tree.AddEquivs(LocalSplits);
473cerr << "\t" << Path.size() << endl;
476// CRef<CSeq_align> Merged;
477// Merged = x_MakeSeqAlign(Path, QueryIDH, SubjtIDH);
479// Output.push_back(Merged);
482EquivRangeBuilder.MergeAbuttings(Path, QuadIter->Storage);
484//QuadIter->Storage.insert(QuadIter->Storage.end(), Path.begin(), Path.end());
485AlignIds = s_AlignIdsFromEquivList(QuadIter->Storage);
486cerr << "\t" << QuadIter->Storage.size()
487<< "\t" << AlignIds.size()
488<< "\t" << s_ScoreFromEquivList(QuadIter->Storage)
490ITERATE(set<int>, AlignIdIter, AlignIds) {
491cerr << "\t" << *AlignIdIter;
496cerr << "NodesVisited: " << NodesVisited << endl;
499CRef<CSeq_align> Merged;
500Merged = x_MakeSeqAlign(Path, QueryIDH, SubjtIDH);
503Output.push_back(Merged);
507ITERATE(TEquivList, PathIter, Path) {
508AlignIds.insert(PathIter->AlignId);
510cerr << "Aligns: " << AlignIds.size() << endl;
512ITERATE(TEquivList, EraseIter, OrigEquivs) {
513if( AlignIds.find(EraseIter->AlignId) != AlignIds.end()) {
514Filtered.push_back(*EraseIter);
517cerr << " Orig: " << OrigEquivs.size() << " Filt: " << Filtered.size() << endl;
518OrigEquivs.swap(Filtered);
519cerr << "_______________________________" << endl;
545Output.push_back(Merged);
556 typedefpair<CSeq_id_Handle, ENa_strand>
TSeqIdPair;
557 typedefpair<TSeqIdPair, TSeqIdPair>
TMapKey;
558 typedefvector<CRef<CSeq_align> >
TAlignVec;
573AlignMap[Key].push_back(*AlignIter);
590 ITERATE(TAlignMap, MapIter, AlignMap) {
596QueryBSH =
m_Scope->GetBioseqHandle(QueryIDH);
597SubjtBSH =
m_Scope->GetBioseqHandle(SubjtIDH);
601TAlignEquivListMap AlignEquivs;
609 if(QueryBSH && SubjtBSH) {
610EquivRangeBuilder.
CalcMatches(QueryBSH, SubjtBSH, Temp);
613Iter->Matches = Iter->Query.GetLength();
614Iter->MisMatches = 0;
619AlignEquivs[AID].insert(AlignEquivs[AID].end(), Temp.begin(), Temp.end());
620OrigEquivs.insert(OrigEquivs.end(), Temp.begin(), Temp.end());
621 #ifdef MERGE_TREE_VERBOSE_DEBUG 622cerr << AID <<
"\t"<< (*AlignIter)->GetSeqRange(0)
623<<
"\t"<< (*AlignIter)->GetSeqRange(1) << endl;
627 #ifdef MERGE_TREE_VERBOSE_DEBUG 628cerr <<
"OrigEquivs; "<< OrigEquivs.size() << endl;
632 if(QueryBSH && SubjtBSH) {
633EquivRangeBuilder.
CalcMatches(QueryBSH, SubjtBSH, OrigEquivs);
636Iter->Matches = Iter->Query.GetLength();
637Iter->MisMatches = 0;
641 #ifdef MERGE_TREE_VERBOSE_DEBUG 645 for(
intLoop = 0; Loop < 3; Loop++) {
646 ITERATE(TAlignEquivListMap, OrigAlignIter, AlignEquivs) {
647 const TEquivList& CurrAlignEquivs = OrigAlignIter->second;
650CurrEquivs.insert(CurrEquivs.end(), AccumEquivs.begin(), AccumEquivs.end());
651CurrEquivs.insert(CurrEquivs.end(), CurrAlignEquivs.begin(), CurrAlignEquivs.end());
677 #ifdef MERGE_TREE_VERBOSE_DEBUG 679 if(AccumScore > NewScore)
680cerr <<
"BACKWARDS!"<< endl;
681AccumScore = NewScore;
687 sort(Abutted.begin(), Abutted.end());
689AccumEquivs = Abutted;
692 #ifdef MERGE_TREE_VERBOSE_DEBUG 693cerr << __LINE__ <<
":"<< AccumEquivs.size()
694<<
":"<< CurrAlignEquivs.size()
695<<
":"<< SplitEquivs.size()
696<<
":"<<
Path.size()
697<<
":"<< Tree.
Size()
698<<
":"<< Tree.
Links()<< endl;
711Output.push_back(Merged);
728 #ifdef MERGE_TREE_VERBOSE_DEBUG 731 " : "<< MapIter->second.size() <<
" aligns"<<endl;
736QueryBSH =
m_Scope->GetBioseqHandle(QueryIDH);
737SubjtBSH =
m_Scope->GetBioseqHandle(SubjtIDH);
744 if(QueryBSH && SubjtBSH &&
751QueryRange += (*AlignIter)->GetSeqRange(0);
752SubjtRange += (*AlignIter)->GetSeqRange(1);
754 if(QueryRange.
GetTo() >= QueryLen ||
755SubjtRange.
GetTo() >= SubjtLen) {
765 #ifdef MERGE_TREE_VERBOSE_DEBUG 766cerr <<
"Unique IDs: "<< QueryIDH.
AsString() <<
" and "<< SubjtIDH.
AsString() << endl;
767cerr <<
" Unique Split: "<< Aligns.size() <<
" into "<< Unique.size() <<
" and "<< Other.size() << endl;
772 if(!Unique.empty()) {
773list<CRef<CSeq_align> > Ins, Outs;
774Ins.insert(Ins.end(), Unique.begin(), Unique.end());
776 #ifdef MERGE_TREE_VERBOSE_DEBUG 777cerr <<
" Unique Merged "<< Ins.size() <<
" to "<< Outs.size() << endl;
780Other.push_back(*OutIter);
807QueryId->Assign(*QueryIDH.
GetSeqId());
809Denseg.
SetIds().push_back(QueryId);
810Denseg.
SetIds().push_back(SubjtId);
817 if(EquivIter->Empty())
820Denseg.
SetStarts().push_back(EquivIter->Query.GetFrom());
821Denseg.
SetStarts().push_back(EquivIter->Subjt.GetFrom());
823Denseg.
SetLens().push_back(EquivIter->Query.GetLength());
825Denseg.
SetStrands().push_back(EquivIter->Strand);
860 const CSeq_align& DiscAlign = **DiscAlignIter;
866AlignGroupMap[Key].push_back(*DiscAlignIter);
876AlignGroupMap[Key].push_back(*AlignIter);
887 boolIntersected =
false;
888 TSeqRangeOuterRanges[] = { (*Outer)->GetSeqRange(0), (*Outer)->GetSeqRange(1) };
892 TSeqRangeInnerRanges[] = { (*Inner)->GetSeqRange(0), (*Inner)->GetSeqRange(1) };
894 if( OuterRanges[0].IntersectingWith(InnerRanges[0]) ||
895OuterRanges[1].IntersectingWith(InnerRanges[1]) ) {
901Other.push_back(*Outer);
903Unique.push_back(*Outer);
947 #ifdef MERGE_TREE_VERBOSE_DEBUG 954 size_t CI= IndexIter->first;
956 size_tOI = IndexIter->second;
957cerr <<
"Near Pair : "<<
CI<<
" x "<< OI <<
" => "<<
CD<< endl;
964cerr <<
"Minimum : "<< MinI <<
" => "<< MinD << endl;
967cerr <<
"Aligns : "<< AlignIter->first <<
" : "<< AlignIter->second.size() << endl;
975: m_EquivRangeBuilder(Original.m_EquivRangeBuilder), m_NextIndex(0)
999NewAlignEquivs.
begin(), NewAlignEquivs.end());
1007 size_tBestI = NewI;
1009 size_t CI= IndexIter->first;
1014 if(CurrDist < BestD) {
1039 size_t CI= IndexIter->first;
1048 #ifdef MERGE_TREE_VERBOSE_DEBUG 1056First.
insert(First.end(), MinEs.begin(), MinEs.end());
1057Second.insert(Second.end(), OtherEs.begin(), OtherEs.end());
1068 if(NearestIter->second == MinI ||
1069NearestIter->second == OtherI) {
1089 const TEquivList& MinEs = AlignIter->second;
1090LastEquivs.insert(LastEquivs.end(), MinEs.begin(), MinEs.end());
1103RemoveGroups[RemoveIter->AlignId].push_back(*RemoveIter);
1107 size_tCurrIndex = AlignIter->first;
1110 if(RemoveGroups.
find(CurrEquivs.front().AlignId) == RemoveGroups.
end()) {
1114 const TEquivList& RemoveGroupEquivs = RemoveGroups[CurrEquivs.front().AlignId];
1117Origs.
insert(Origs.end(), CurrEquivs.begin(), CurrEquivs.end());
1118Origs.insert(Origs.end(), RemoveGroupEquivs.begin(), RemoveGroupEquivs.end());
1126 if(SplitIter->AlignId == RemoveIter->AlignId &&
1127SplitIter->SegmtId == RemoveIter->SegmtId) {
1128 if(SplitIter->IntersectingWith(*RemoveIter)) {
1135Remaining.push_back(*SplitIter);
1142 if(CurrEquivs.empty()) {
1152 if(NearestIter->second == RemoveGroupIter->first) {
1168vector<size_t> Indexes;
1170Indexes.push_back(AlignIter->first);
1175 for( OII = 0; OII < Indexes.size(); OII++) {
1183 boolFound =
false;
1184 for( III = OII+1; III < Indexes.size(); III++) {
1190 if(CurrDist < BestDist) {
1192BestDist = CurrDist;
1213 boolFound =
false;
1216 size_tCurrIndex = AlignIter->first;
1217 if(CurrIndex == CalcIndex)
1221 if(CurrDist < BestDist) {
1223BestDist = CurrDist;
1244 boolUniform =
true;
1246 if(EquivIter->AlignId != Equivs.front().AlignId) {
1253 returnEquivs.front().AlignId;
1264 const intPASSES_BEFORE_EARLY_REMOVE = 5;
1265list<CRef<CSeq_align> > EarlyRemoves;
1271 #ifdef MERGE_TREE_VERBOSE_DEBUG 1272cerr <<
" Starting : "<< Aligns.size() << endl;
1276 TSeqPosOrigMatches = 0, AllMergeMatches = 0;
1281 if(QueryBSH && SubjtBSH) {
1282EquivRangeBuilder.
CalcMatches(QueryBSH, SubjtBSH, Temp);
1285Iter->Matches = Iter->Query.GetLength();
1286Iter->MisMatches = 0;
1290OrigMatches += EquivIter->Matches;
1292 #ifdef MERGE_TREE_VERBOSE_DEBUG 1300 typedefpair<int, size_t> TAlignIdScorePair;
1301 typedefpair<TAlignIdScorePair,TAlignIdScorePair> TAlignIdScoreKey;
1303TMergeResultMap MergeResultMap;
1304 const intALL_MIN = 1;
1305 const intALL_OTHER = 2;
1306 const intFULL_MERGE = 3;
1307 const intMIXED = 4;
1309 intPassCounter = 0;
1310 while(!OriginalGraph.
Empty()) {
1313 #ifdef MERGE_TREE_VERBOSE_DEBUG 1314cerr <<
" --Starting : "<< CurrGraph.
Size() << endl;
1322 while(CurrGraph.
Size() > 1) {
1323 #ifdef MERGE_TREE_VERBOSE_DEBUG 1324cerr <<
" --++Starting : "<< CurrGraph.
Size() <<
" :::: "<< PassCounter << endl;
1330 if(MinEs.empty() || OtherEs.empty()) {
1333 else if(!OtherEs.empty())
1339TAlignIdScoreKey
key;
1344 #ifdef MERGE_TREE_VERBOSE_DEBUG 1345cerr <<
" --++MinEs id: "<<
key.first.first <<
" score: "<<
key.first.second <<
" len: "<< MinEs.size()<< endl;
1346cerr <<
" --++OtherEs id: "<<
key.second.first <<
" score: "<<
key.second.second <<
" len: "<< OtherEs.size()<< endl;
1349 if(
key.first.first != -1 &&
key.second.first != -1) {{
1350 if(MergeResultMap.find(
key) != MergeResultMap.end()) {
1351 intMergeResult = MergeResultMap[
key];
1352 #ifdef MERGE_TREE_VERBOSE_DEBUG 1353cerr <<
" --++ Had Cached Value: "<< MergeResult << endl;
1355 if(MergeResult == FULL_MERGE) {
1356CachedPath.insert(CachedPath.end(), MinEs.begin(), MinEs.end());
1357CachedPath.insert(CachedPath.end(), OtherEs.begin(), OtherEs.end());
1358 sort(CachedPath.begin(), CachedPath.end());
1359}
else if(MergeResult == ALL_MIN) {
1361}
else if(MergeResult == ALL_OTHER) {
1362CachedPath = OtherEs;
1369 if(CachedPath.empty()) {
1371CurrEquivs.insert(CurrEquivs.end(), MinEs.begin(), MinEs.end());
1372CurrEquivs.insert(CurrEquivs.end(), OtherEs.begin(), OtherEs.end());
1373 sort(CurrEquivs.begin(), CurrEquivs.end());
1376 #ifdef MERGE_TREE_VERBOSE_DEBUG 1378cerr <<
" --++SplitEquivs : "<< CurrEquivs.size() <<
" to "<< SplitEquivs.size() << endl;
1391 if(
Path.empty()) {
1392Output.insert(Output.end(), EarlyRemoves.begin(), EarlyRemoves.end());
1397 sort(Abutted.begin(), Abutted.end());
1399 if(
key.first.first != -1 &&
key.second.first != -1) {{
1402 #ifdef MERGE_TREE_VERBOSE_DEBUG 1403cerr <<
" --++Result id: "<< ResultId <<
" score: "<< ResultLength <<
" len: "<< Abutted.size()<< endl;
1405 intMergeResult = 0;
1406 if(ResultId == -1 && ResultLength == (
key.first.second+
key.second.second)) {
1407MergeResult = FULL_MERGE;
1408}
else if(ResultId ==
key.first.first && ResultLength ==
key.first.second) {
1409MergeResult = ALL_MIN;
1410}
else if(ResultId ==
key.second.first && ResultLength ==
key.second.second) {
1411MergeResult = ALL_OTHER;
1413MergeResult = MIXED;
1415MergeResultMap[
key] = MergeResult;
1416 #ifdef MERGE_TREE_VERBOSE_DEBUG 1417cerr <<
" --++New MergeResult: "<< MergeResult << endl;
1423 sort(Abutted.begin(), Abutted.end());
1427 if(!Abutted.empty()) {
1428 #ifdef MERGE_TREE_VERBOSE_DEBUG 1429cerr <<
" --++Merged from : "<< MinEs.size() <<
" and "<< OtherEs.size() << endl;
1430cerr <<
" --++Re-inserting Merged Alignment: "<< Abutted.size() << endl;
1443 if(!Abutted.empty() && PassCounter > PASSES_BEFORE_EARLY_REMOVE) {{
1445 if(ResultId != -1) {
1448 if( (Abutted.size() == MinEs.size() &&
1449ResultId == MinEId) ||
1450(Abutted.size() == OtherEs.size() &&
1451ResultId == OtherEId) ) {
1458 if(ResultId == MinEId) {
1460}
else if(ResultId == OtherEId) {
1463 if(LoserEs !=
NULL) {
1465AllMergeMatches += EquivIter->Matches;
1470EarlyRemoves.push_back(Merged);
1478 #ifdef MERGE_TREE_VERBOSE_DEBUG 1480 intMinScore = Tree.
Score(MinEs);
1481 intOtherScore = Tree.
Score(OtherEs);
1482 intNewScore = Tree.
Score(Abutted);
1484 if(NewScore < MinScore || NewScore < OtherScore) {
1485cerr <<
"BACKWARDS!"<< endl;
1493 if(!CurrGraph.
Empty()) {
1497AllMergeMatches += EquivIter->Matches;
1499 if(!LastEquivs.empty()) {
1503Output.push_back(Merged);
1511Output.insert(Output.end(), EarlyRemoves.begin(), EarlyRemoves.end());
1513 #ifdef MERGE_TREE_VERBOSE_DEBUG 1514cerr <<
"Orig : "<< OrigMatches <<
" vs "<< AllMergeMatches << endl;
1515 if(OrigMatches != AllMergeMatches)
1516cerr <<
"MATCHES PROBLEM!"<< endl;
void x_CalculateAllDistances()
CAlignDistGraph(CEquivRangeBuilder &Builder)
void AddAlignment(const TEquivList &NewAlignEquivs)
bool GetAndRemoveNearestPair(TEquivList &First, TEquivList &Second)
CEquivRangeBuilder & m_EquivRangeBuilder
void x_CalculateOneDistance(size_t CalcIndex)
void RemoveEquivs(const TEquivList &RemoveEquivs)
map< size_t, TSeqPos > TIndexDistMap
void CalculateAllDistances()
map< size_t, size_t > TIndexIndexMap
TIndexDistMap NearestDistMap
map< size_t, TEquivList > TAlignEquivListMap
TAlignEquivListMap AlignEquivMap
bool GetLastAlignEquivs(TEquivList &LastEquivs)
TIndexIndexMap NearestMap
CRef< CDense_seg > FillUnaligned() const
Create a new dense-seg with added all unaligned pieces (implicit inserts), if any,...
void Compact()
Join adjacent mergeable segments to create a more compact alignment.
void Assign(const CSerialObject &obj, ESerialRecursionMode how=eRecursive)
overloaded Assign()
void CalcMatches(objects::CBioseq_Handle QueryHandle, objects::CBioseq_Handle SubjtHandle, TEquivList &Equivs)
bool MergeAbuttings(const TEquivList &Originals, TEquivList &Merges)
void ExtractRangesFromSeqAlign(const objects::CSeq_align &Alignment, TEquivList &Equivs)
bool SplitIntersections(const TEquivList &Originals, TEquivList &Splits)
static TSeqPos Distance(const CEquivRange &A, const CEquivRange &B)
int Score(const TEquivList &Path) const
void SetScoring(SScoring Scoring)
TInterruptFnPtr SetInterruptCallback(TInterruptFnPtr Callback, void *CallbackData)
void Search(TEquivList &Path, bool Once=false)
void AddEquivs(const TEquivList &Equivs)
const CSeq_id & GetSeq_id(TDim row) const
Get seq-id (the first one if segments have different ids).
ENa_strand GetSeqStrand(TDim row) const
Get strand (the first one if segments have different strands).
void Validate(bool full_test=false) const
pair< TSeqIdPair, TSeqIdPair > TMapKey
void x_SplitGlobalUnique(const TAlignVec &Input, TAlignVec &Unique, TAlignVec &Other)
void Merge(const list< CRef< objects::CSeq_align > > &Input, list< CRef< objects::CSeq_align > > &Output)
void x_MakeMergeableGroups(list< CRef< objects::CSeq_align > > Input, TAlignGroupMap &AlignGroupMap)
vector< CRef< objects::CSeq_align > > TAlignVec
void Merge_Dist(const list< CRef< objects::CSeq_align > > &Input, list< CRef< objects::CSeq_align > > &Output)
void Merge_Pairwise(const list< CRef< objects::CSeq_align > > &Input, list< CRef< objects::CSeq_align > > &Output)
CRef< objects::CSeq_align > x_MakeSeqAlign(TEquivList &Equivs, objects::CSeq_id_Handle QueryIDH, objects::CSeq_id_Handle SubjtIDH)
void Merge_AllAtOnce(const list< CRef< objects::CSeq_align > > &Input, list< CRef< objects::CSeq_align > > &Output)
CMergeTree::TInterruptFnPtr Callback
objects::CScope * m_Scope
pair< objects::CSeq_id_Handle, objects::ENa_strand > TSeqIdPair
CMergeTree::SScoring m_Scoring
void x_Merge_Dist_Impl(TAlignVec &Aligns, objects::CSeq_id_Handle QueryIDH, objects::CSeq_id_Handle SubjtIDH, objects::CBioseq_Handle QueryBSH, objects::CBioseq_Handle SubjtBSH, list< CRef< objects::CSeq_align > > &Output)
const_iterator begin() const
const_iterator end() const
iterator_bool insert(const value_type &val)
const_iterator find(const key_type &key) const
iterator_bool insert(const value_type &val)
bool s_SortEquivBySubjt(const CEquivRange &A, const CEquivRange &B)
vector< CEquivRange > TEquivList
string Path(const string &dir, const string &file)
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.
int TSignedSeqPos
Type for signed sequence position.
#define NON_CONST_ITERATE(Type, Var, Cont)
Non constant version of ITERATE macro.
#define ERR_POST(message)
Error posting with file, line number information but without error codes.
void Error(CExceptionArgs_Base &args)
#define NCBI_THROW(exception_class, err_code, message)
Generic macro to throw an exception, given the exception class, error code and message string.
string ReportAll(TDiagPostFlags flags=eDPF_Exception) const
Report all exceptions.
#define MSerial_AsnText
I/O stream manipulators â.
virtual void Assign(const CSerialObject &source, ESerialRecursionMode how=eRecursive)
Optimized implementation of CSerialObject::Assign, which is not so efficient.
CConstRef< CSeq_id > GetSeqId(void) const
static CSeq_id_Handle GetHandle(const CSeq_id &id)
Normal way of getting a handle, works for any seq-id.
string AsString(void) const
bool CanGetInst_Length(void) const
TInst_Length GetInst_Length(void) const
TThisType IntersectionWith(const TThisType &r) const
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
TTo GetTo(void) const
Get the To member data.
TFrom GetFrom(void) const
Get the From member data.
TLens & SetLens(void)
Assign a value to Lens data member.
void SetSegs(TSegs &value)
Assign a value to Segs data member.
void SetDim(TDim value)
Assign a value to Dim data member.
void SetType(TType value)
Assign a value to Type data member.
TStarts & SetStarts(void)
Assign a value to Starts data member.
TStrands & SetStrands(void)
Assign a value to Strands data member.
bool IsDisc(void) const
Check if variant Disc is selected.
void SetNumseg(TNumseg value)
Assign a value to Numseg data member.
TIds & SetIds(void)
Assign a value to Ids data member.
const TDisc & GetDisc(void) const
Get the variant data.
const Tdata & Get(void) const
Get the member data.
const TSegs & GetSegs(void) const
Get the Segs member data.
@ eType_partial
mapping pieces together
unsigned int
A callback function used to compare two keys in a database.
bool s_SortSeqAlignByQuery_Subjt(CRef< CSeq_align > A, CRef< CSeq_align > B)
void s_EquivDiff(const TEquivList &A, const TEquivList &B)
bool s_SortSeqAlignByIntercept(CRef< CSeq_align > A, CRef< CSeq_align > B)
bool s_SortSeqAlignByLength(CRef< CSeq_align > A, CRef< CSeq_align > B)
TSeqPos s_AlignDist(const CSeq_align &A, const CSeq_align &B)
set< int > s_AlignIdsFromEquivList(const TEquivList &Equivs)
TSignedSeqPos s_SeqAlignIntercept(const CSeq_align &A)
bool s_SortSeqAlignByQueryMinus_Subjt(CRef< CSeq_align > A, CRef< CSeq_align > B)
size_t s_LengthFromEquivList(const TEquivList &Equivs)
size_t s_ScoreFromEquivList(const TEquivList &Equivs)
int s_UniformAlignId(const TEquivList &Equivs)
void s_FindBestSubRange(const CMergeTree &Tree, const TEquivList &Path)
constexpr auto sort(_Init &&init)
const struct ncbi::grid::netcache::search::fields::KEY key
#define F(x)
Make a parametrized function appear to have only one variable.
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