63 AlignIds.
insert(EquivIter->AlignId);
69 size_t MisMatches = 0;
71 Matches += EquivIter->Matches;
72 MisMatches += EquivIter->MisMatches;
78 size_t MisMatches = 0;
80 Matches += EquivIter->Matches;
81 MisMatches += EquivIter->MisMatches;
83 return Matches+MisMatches;
119 InterA =
int(
A.GetSeqStart(1)) -
int(
A.GetSeqStart(0));
121 InterA =
A.GetSeqStop(1) +
A.GetSeqStart(0);
132 return (InterA < InterB);
143 TEquivList::const_iterator AI, BI;
144 TEquivList::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
165 cerr <<
" < " << *AI << endl;
170 else if(BI->Query.GetFrom() < AI->Query.GetFrom()) {
171 #ifdef MERGE_TREE_VERBOSE_DEBUG
172 cerr <<
" > " << *BI << endl;
178 if(AI->Subjt.GetFrom() < BI->Subjt.GetFrom()) {
179 #ifdef MERGE_TREE_VERBOSE_DEBUG
180 cerr <<
" < " << *AI << endl;
185 else if(BI->Subjt.GetFrom() < AI->Subjt.GetFrom()) {
186 #ifdef MERGE_TREE_VERBOSE_DEBUG
187 cerr <<
" > " << *BI << endl;
193 #ifdef MERGE_TREE_VERBOSE_DEBUG
194 cerr <<
" < " << *AI << endl;
195 cerr <<
" > " << *BI << endl;
206 #ifdef MERGE_TREE_VERBOSE_DEBUG
207 cerr <<
" > " << *AI << endl;
212 #ifdef MERGE_TREE_VERBOSE_DEBUG
213 cerr <<
" < " << *BI << endl;
251 return max(D, DeltaInt);
261 #ifdef MERGE_TREE_VERBOSE_DEBUG
269 for(L=0; L < (
int)
Path.size(); L++) {
270 CurrPath.push_back(
Path[L] );
271 int CurrScore = Tree.
Score(CurrPath);
272 if(CurrScore >= BestScore) {
274 BestScore = CurrScore;
280 for(
F = BL;
F >= 0;
F--) {
281 CurrPath.insert(CurrPath.begin(),
Path[
F]);
282 int CurrScore = Tree.
Score(CurrPath);
283 if(CurrScore >= BestScore) {
284 #ifdef MERGE_TREE_VERBOSE_DEBUG
287 BestScore = CurrScore;
292 #ifdef MERGE_TREE_VERBOSE_DEBUG
293 if(
BF > 0 || BL < (
int)(
Path.size()-1) ) {
294 cerr <<
"s_FindBestSubRange : " <<
BF <<
" : " << BL <<
" : " << BestScore <<
" of " <<
Path.size()-1 << endl;
311 typedef pair<CSeq_id_Handle, ENa_strand>
TSeqIdPair;
312 typedef pair<TSeqIdPair, TSeqIdPair>
TMapKey;
313 typedef vector<CRef<CSeq_align> >
TAlignVec;
326 AlignMap[Key].push_back(*AlignIter);
336 ITERATE(TAlignMap, MapIter, AlignMap) {
342 QueryBSH =
m_Scope->GetBioseqHandle(QueryIDH);
343 SubjtBSH =
m_Scope->GetBioseqHandle(SubjtIDH);
350 #ifdef MERGE_TREE_VERBOSE_DEBUG
351 cerr << AID <<
"\t" << (*AlignIter)->GetSeqRange(0)
352 <<
"\t" << (*AlignIter)->GetSeqRange(1) << endl;
357 #ifdef MERGE_TREE_VERBOSE_DEBUG
358 cerr <<
"OrigEquivs; " << OrigEquivs.size() << endl;
362 if(QueryBSH && SubjtBSH) {
363 EquivRangeBuilder.
CalcMatches(QueryBSH, SubjtBSH, OrigEquivs);
366 Iter->Matches = Iter->Query.GetLength();
367 Iter->MisMatches = 0;
375 CRangeCollection<TSeqPos> QRC, SRC;
376 CRangeCollection<TSeqPos> DQRC, DSRC;
377 ITERATE(TEquivList, Iter, OrigEquivs) {
378 if(QRC.IntersectingWith(Iter->Query)) {
379 CRangeCollection<TSeqPos> T(Iter->Query);
380 T.IntersectWith(QRC);
383 if(SRC.IntersectingWith(Iter->Subjt)) {
384 CRangeCollection<TSeqPos> T(Iter->Subjt);
385 T.IntersectWith(SRC);
391 CRangeCollection<TSeqPos> NQRC, NSRC;
392 NQRC += QRC.GetLimits();
393 NSRC += SRC.GetLimits();
397 vector<TSeqPos> RQs, RSs;
398 RQs.push_back(QRC.GetFrom());
399 ITERATE(CRangeCollection<TSeqPos>, Iter, NQRC) {
400 RQs.push_back(Iter->GetFrom());
401 RQs.push_back(Iter->GetTo());
402 cerr << "QZ: " << *Iter << endl;
404 RQs.push_back(QRC.GetTo()+1);
405 RSs.push_back(SRC.GetFrom());
406 ITERATE(CRangeCollection<TSeqPos>, Iter, NSRC) {
407 RSs.push_back(Iter->GetFrom());
408 RSs.push_back(Iter->GetTo());
409 cerr << "SZ: " << *Iter << endl;
411 RSs.push_back(SRC.GetTo()+1);
413 vector<TSeqPos>::iterator NE;
414 sort(RQs.begin(), RQs.end());
415 NE = unique(RQs.begin(), RQs.end());
416 RQs.erase(NE, RQs.end());
417 sort(RSs.begin(), RSs.end());
418 NE = unique(RSs.begin(), RSs.end());
419 RSs.erase(NE, RSs.end());
423 CMergeTree::SScoring QuadScoring;
424 QuadScoring.GapExtend = 0;
426 ITERATE(TEquivList, Iter, OrigEquivs) {
427 QR.CombineWith(Iter->Query);
428 SR.CombineWith(Iter->Subjt);
430 cerr << QR << "\t" << SR << endl;
431 CQuadTree QT(64, QR, SR);
432 QT.SetRecs(RQs, RSs);
433 ITERATE(TEquivList, Iter, OrigEquivs) {
438 int NodesVisited = 0;
440 NON_CONST_ITERATE(CQuadTree, QuadIter, QT) {
443 if(!QuadIter->IsLeaf)
446 if(QuadIter->Storage.empty())
449 set<int> AlignIds = s_AlignIdsFromEquivList(QuadIter->Storage);
450 cerr << QuadIter->XR << "\t" << QuadIter->YR
451 << "\t" << QuadIter->Depth
452 << "\t" << QuadIter->Storage.size()
453 << "\t" << AlignIds.size()
454 << "\t" << s_ScoreFromEquivList(QuadIter->Storage)
456 ITERATE(set<int>, AlignIdIter, AlignIds) {
457 cerr << "\t" << *AlignIdIter;
461 TEquivList LocalSplits;
462 EquivRangeBuilder.SplitIntersections(QuadIter->Storage, LocalSplits);
463 QuadIter->Storage.clear();
466 Tree.SetScoring(QuadScoring); //m_Scoring);
467 Tree.AddEquivs(LocalSplits);
473 cerr << "\t" << Path.size() << endl;
476 // CRef<CSeq_align> Merged;
477 // Merged = x_MakeSeqAlign(Path, QueryIDH, SubjtIDH);
479 // Output.push_back(Merged);
482 EquivRangeBuilder.MergeAbuttings(Path, QuadIter->Storage);
484 //QuadIter->Storage.insert(QuadIter->Storage.end(), Path.begin(), Path.end());
485 AlignIds = s_AlignIdsFromEquivList(QuadIter->Storage);
486 cerr << "\t" << QuadIter->Storage.size()
487 << "\t" << AlignIds.size()
488 << "\t" << s_ScoreFromEquivList(QuadIter->Storage)
490 ITERATE(set<int>, AlignIdIter, AlignIds) {
491 cerr << "\t" << *AlignIdIter;
496 cerr << "NodesVisited: " << NodesVisited << endl;
499 CRef<CSeq_align> Merged;
500 Merged = x_MakeSeqAlign(Path, QueryIDH, SubjtIDH);
503 Output.push_back(Merged);
507 ITERATE(TEquivList, PathIter, Path) {
508 AlignIds.insert(PathIter->AlignId);
510 cerr << "Aligns: " << AlignIds.size() << endl;
512 ITERATE(TEquivList, EraseIter, OrigEquivs) {
513 if( AlignIds.find(EraseIter->AlignId) != AlignIds.end()) {
514 Filtered.push_back(*EraseIter);
517 cerr << " Orig: " << OrigEquivs.size() << " Filt: " << Filtered.size() << endl;
518 OrigEquivs.swap(Filtered);
519 cerr << "_______________________________" << endl;
545 Output.push_back(Merged);
556 typedef pair<CSeq_id_Handle, ENa_strand>
TSeqIdPair;
557 typedef pair<TSeqIdPair, TSeqIdPair>
TMapKey;
558 typedef vector<CRef<CSeq_align> >
TAlignVec;
573 AlignMap[Key].push_back(*AlignIter);
590 ITERATE(TAlignMap, MapIter, AlignMap) {
596 QueryBSH =
m_Scope->GetBioseqHandle(QueryIDH);
597 SubjtBSH =
m_Scope->GetBioseqHandle(SubjtIDH);
601 TAlignEquivListMap AlignEquivs;
609 if(QueryBSH && SubjtBSH) {
610 EquivRangeBuilder.
CalcMatches(QueryBSH, SubjtBSH, Temp);
613 Iter->Matches = Iter->Query.GetLength();
614 Iter->MisMatches = 0;
619 AlignEquivs[AID].insert(AlignEquivs[AID].end(), Temp.begin(), Temp.end());
620 OrigEquivs.insert(OrigEquivs.end(), Temp.begin(), Temp.end());
621 #ifdef MERGE_TREE_VERBOSE_DEBUG
622 cerr << AID <<
"\t" << (*AlignIter)->GetSeqRange(0)
623 <<
"\t" << (*AlignIter)->GetSeqRange(1) << endl;
627 #ifdef MERGE_TREE_VERBOSE_DEBUG
628 cerr <<
"OrigEquivs; " << OrigEquivs.size() << endl;
632 if(QueryBSH && SubjtBSH) {
633 EquivRangeBuilder.
CalcMatches(QueryBSH, SubjtBSH, OrigEquivs);
636 Iter->Matches = Iter->Query.GetLength();
637 Iter->MisMatches = 0;
641 #ifdef MERGE_TREE_VERBOSE_DEBUG
645 for(
int Loop = 0; Loop < 3; Loop++) {
646 ITERATE(TAlignEquivListMap, OrigAlignIter, AlignEquivs) {
647 const TEquivList& CurrAlignEquivs = OrigAlignIter->second;
650 CurrEquivs.insert(CurrEquivs.end(), AccumEquivs.begin(), AccumEquivs.end());
651 CurrEquivs.insert(CurrEquivs.end(), CurrAlignEquivs.begin(), CurrAlignEquivs.end());
677 #ifdef MERGE_TREE_VERBOSE_DEBUG
679 if(AccumScore > NewScore)
680 cerr <<
"BACKWARDS!" << endl;
681 AccumScore = NewScore;
687 sort(Abutted.begin(), Abutted.end());
689 AccumEquivs = Abutted;
692 #ifdef MERGE_TREE_VERBOSE_DEBUG
693 cerr << __LINE__ <<
":" << AccumEquivs.size()
694 <<
":" << CurrAlignEquivs.size()
695 <<
":" << SplitEquivs.size()
696 <<
":" <<
Path.size()
697 <<
":" << Tree.
Size()
698 <<
":" << Tree.
Links()<< endl;
711 Output.push_back(Merged);
728 #ifdef MERGE_TREE_VERBOSE_DEBUG
731 " : " << MapIter->second.size() <<
" aligns"<<endl;
736 QueryBSH =
m_Scope->GetBioseqHandle(QueryIDH);
737 SubjtBSH =
m_Scope->GetBioseqHandle(SubjtIDH);
744 if (QueryBSH && SubjtBSH &&
751 QueryRange += (*AlignIter)->GetSeqRange(0);
752 SubjtRange += (*AlignIter)->GetSeqRange(1);
754 if (QueryRange.
GetTo() >= QueryLen ||
755 SubjtRange.
GetTo() >= SubjtLen) {
765 #ifdef MERGE_TREE_VERBOSE_DEBUG
766 cerr <<
"Unique IDs: " << QueryIDH.
AsString() <<
" and " << SubjtIDH.
AsString() << endl;
767 cerr <<
" Unique Split: " << Aligns.size() <<
" into " << Unique.size() <<
" and " << Other.size() << endl;
772 if(!Unique.empty()) {
773 list<CRef<CSeq_align> > Ins, Outs;
774 Ins.insert(Ins.end(), Unique.begin(), Unique.end());
776 #ifdef MERGE_TREE_VERBOSE_DEBUG
777 cerr <<
" Unique Merged " << Ins.size() <<
" to " << Outs.size() << endl;
780 Other.push_back(*OutIter);
807 QueryId->Assign(*QueryIDH.
GetSeqId());
809 Denseg.
SetIds().push_back(QueryId);
810 Denseg.
SetIds().push_back(SubjtId);
817 if(EquivIter->Empty())
820 Denseg.
SetStarts().push_back(EquivIter->Query.GetFrom());
821 Denseg.
SetStarts().push_back(EquivIter->Subjt.GetFrom());
823 Denseg.
SetLens().push_back(EquivIter->Query.GetLength());
825 Denseg.
SetStrands().push_back(EquivIter->Strand);
860 const CSeq_align& DiscAlign = **DiscAlignIter;
866 AlignGroupMap[Key].push_back(*DiscAlignIter);
876 AlignGroupMap[Key].push_back(*AlignIter);
887 bool Intersected =
false;
888 TSeqRange OuterRanges[] = { (*Outer)->GetSeqRange(0), (*Outer)->GetSeqRange(1) };
892 TSeqRange InnerRanges[] = { (*Inner)->GetSeqRange(0), (*Inner)->GetSeqRange(1) };
894 if( OuterRanges[0].IntersectingWith(InnerRanges[0]) ||
895 OuterRanges[1].IntersectingWith(InnerRanges[1]) ) {
901 Other.push_back(*Outer);
903 Unique.push_back(*Outer);
947 #ifdef MERGE_TREE_VERBOSE_DEBUG
954 size_t CI = IndexIter->first;
956 size_t OI = IndexIter->second;
957 cerr <<
"Near Pair : " <<
CI <<
" x " << OI <<
" => " <<
CD << endl;
964 cerr <<
"Minimum : " << MinI <<
" => " << MinD << endl;
967 cerr <<
"Aligns : " << AlignIter->first <<
" : " << AlignIter->second.size() << endl;
975 : m_EquivRangeBuilder(Original.m_EquivRangeBuilder), m_NextIndex(0)
999 NewAlignEquivs.begin(), NewAlignEquivs.end());
1007 size_t BestI = NewI;
1009 size_t CI = IndexIter->first;
1014 if(CurrDist < BestD) {
1039 size_t CI = IndexIter->first;
1048 #ifdef MERGE_TREE_VERBOSE_DEBUG
1056 First.
insert(First.end(), MinEs.begin(), MinEs.end());
1057 Second.insert(Second.end(), OtherEs.begin(), OtherEs.end());
1068 if (NearestIter->second == MinI ||
1069 NearestIter->second == OtherI) {
1090 LastEquivs.insert(LastEquivs.end(), MinEs.begin(), MinEs.end());
1103 RemoveGroups[RemoveIter->AlignId].push_back(*RemoveIter);
1107 size_t CurrIndex = AlignIter->first;
1110 if(RemoveGroups.
find(CurrEquivs.front().AlignId) == RemoveGroups.
end()) {
1114 const TEquivList& RemoveGroupEquivs = RemoveGroups[CurrEquivs.front().AlignId];
1117 Origs.
insert(Origs.end(), CurrEquivs.begin(), CurrEquivs.end());
1118 Origs.insert(Origs.end(), RemoveGroupEquivs.begin(), RemoveGroupEquivs.end());
1126 if (SplitIter->AlignId == RemoveIter->AlignId &&
1127 SplitIter->SegmtId == RemoveIter->SegmtId) {
1128 if(SplitIter->IntersectingWith(*RemoveIter)) {
1135 Remaining.push_back(*SplitIter);
1142 if(CurrEquivs.empty()) {
1152 if (NearestIter->second == RemoveGroupIter->first) {
1168 vector<size_t> Indexes;
1170 Indexes.push_back(AlignIter->first);
1175 for( OII = 0; OII < Indexes.size(); OII++) {
1184 for( III = OII+1; III < Indexes.size(); III++) {
1190 if(CurrDist < BestDist) {
1192 BestDist = CurrDist;
1216 size_t CurrIndex = AlignIter->first;
1217 if(CurrIndex == CalcIndex)
1221 if(CurrDist < BestDist) {
1223 BestDist = CurrDist;
1244 bool Uniform =
true;
1246 if(EquivIter->AlignId != Equivs.front().AlignId) {
1253 return Equivs.front().AlignId;
1264 const int PASSES_BEFORE_EARLY_REMOVE = 5;
1265 list<CRef<CSeq_align> > EarlyRemoves;
1271 #ifdef MERGE_TREE_VERBOSE_DEBUG
1272 cerr <<
" Starting : " << Aligns.size() << endl;
1276 TSeqPos OrigMatches = 0, AllMergeMatches = 0;
1281 if(QueryBSH && SubjtBSH) {
1282 EquivRangeBuilder.
CalcMatches(QueryBSH, SubjtBSH, Temp);
1285 Iter->Matches = Iter->Query.GetLength();
1286 Iter->MisMatches = 0;
1290 OrigMatches += EquivIter->Matches;
1292 #ifdef MERGE_TREE_VERBOSE_DEBUG
1300 typedef pair<int, size_t> TAlignIdScorePair;
1301 typedef pair<TAlignIdScorePair,TAlignIdScorePair> TAlignIdScoreKey;
1303 TMergeResultMap MergeResultMap;
1304 const int ALL_MIN = 1;
1305 const int ALL_OTHER = 2;
1306 const int FULL_MERGE = 3;
1307 const int MIXED = 4;
1309 int PassCounter = 0;
1310 while(!OriginalGraph.
Empty()) {
1313 #ifdef MERGE_TREE_VERBOSE_DEBUG
1314 cerr <<
" --Starting : " << CurrGraph.
Size() << endl;
1322 while(CurrGraph.
Size() > 1) {
1323 #ifdef MERGE_TREE_VERBOSE_DEBUG
1324 cerr <<
" --++Starting : " << CurrGraph.
Size() <<
" :::: " << PassCounter << endl;
1330 if(MinEs.empty() || OtherEs.empty()) {
1333 else if(!OtherEs.empty())
1339 TAlignIdScoreKey
key;
1344 #ifdef MERGE_TREE_VERBOSE_DEBUG
1345 cerr <<
" --++MinEs id: " <<
key.first.first <<
" score: " <<
key.first.second <<
" len: " << MinEs.size()<< endl;
1346 cerr <<
" --++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 int MergeResult = MergeResultMap[
key];
1352 #ifdef MERGE_TREE_VERBOSE_DEBUG
1353 cerr <<
" --++ Had Cached Value: " << MergeResult << endl;
1355 if(MergeResult == FULL_MERGE) {
1356 CachedPath.insert(CachedPath.end(), MinEs.begin(), MinEs.end());
1357 CachedPath.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) {
1362 CachedPath = OtherEs;
1369 if (CachedPath.empty()) {
1371 CurrEquivs.insert(CurrEquivs.end(), MinEs.begin(), MinEs.end());
1372 CurrEquivs.insert(CurrEquivs.end(), OtherEs.begin(), OtherEs.end());
1373 sort(CurrEquivs.begin(), CurrEquivs.end());
1376 #ifdef MERGE_TREE_VERBOSE_DEBUG
1378 cerr <<
" --++SplitEquivs : " << CurrEquivs.size() <<
" to " << SplitEquivs.size() << endl;
1392 Output.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
1403 cerr <<
" --++Result id: " << ResultId <<
" score: " << ResultLength <<
" len: " << Abutted.size()<< endl;
1405 int MergeResult = 0;
1406 if (ResultId == -1 && ResultLength == (
key.first.second+
key.second.second)) {
1407 MergeResult = FULL_MERGE;
1408 }
else if (ResultId ==
key.first.first && ResultLength ==
key.first.second) {
1409 MergeResult = ALL_MIN;
1410 }
else if (ResultId ==
key.second.first && ResultLength ==
key.second.second) {
1411 MergeResult = ALL_OTHER;
1413 MergeResult = MIXED;
1415 MergeResultMap[
key] = MergeResult;
1416 #ifdef MERGE_TREE_VERBOSE_DEBUG
1417 cerr <<
" --++New MergeResult: " << MergeResult << endl;
1423 sort(Abutted.begin(), Abutted.end());
1427 if(!Abutted.empty()) {
1428 #ifdef MERGE_TREE_VERBOSE_DEBUG
1429 cerr <<
" --++Merged from : " << MinEs.size() <<
" and " << OtherEs.size() << endl;
1430 cerr <<
" --++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() &&
1449 ResultId == MinEId) ||
1450 (Abutted.size() == OtherEs.size() &&
1451 ResultId == OtherEId) ) {
1458 if(ResultId == MinEId) {
1460 }
else if(ResultId == OtherEId) {
1463 if(LoserEs !=
NULL) {
1465 AllMergeMatches += EquivIter->Matches;
1470 EarlyRemoves.push_back(Merged);
1478 #ifdef MERGE_TREE_VERBOSE_DEBUG
1480 int MinScore = Tree.
Score(MinEs);
1481 int OtherScore = Tree.
Score(OtherEs);
1482 int NewScore = Tree.
Score(Abutted);
1484 if(NewScore < MinScore || NewScore < OtherScore) {
1485 cerr <<
"BACKWARDS!" << endl;
1493 if(!CurrGraph.
Empty()) {
1497 AllMergeMatches += EquivIter->Matches;
1499 if(!LastEquivs.empty()) {
1503 Output.push_back(Merged);
1511 Output.insert(Output.end(), EarlyRemoves.begin(), EarlyRemoves.end());
1513 #ifdef MERGE_TREE_VERBOSE_DEBUG
1514 cerr <<
"Orig : " << OrigMatches <<
" vs " << AllMergeMatches << endl;
1515 if(OrigMatches != AllMergeMatches)
1516 cerr <<
"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)
CRange< TSeqPos > GetSeqRange(TDim row) const
GetSeqRange NB: On a Spliced-seg, in case the product-type is protein, these only return the amin par...
TSeqPos GetSeqStop(TDim row) const
const CSeq_id & GetSeq_id(TDim row) const
Get seq-id (the first one if segments have different ids).
TSeqPos GetSeqStart(TDim row) const
ENa_strand GetSeqStrand(TDim row) const
Get strand (the first one if segments have different strands).
TSeqPos GetAlignLength(bool include_gaps=true) const
Get the length of this alignment.
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.