(
int i= shift; id_pool[
i] != 0; ++
i)
51target.push_back(id_pool[
i]);
76 if(
a.Strand() ==
ePlus)
77ss =
m_introns.front().m_sig.substr(0,2);
79ss =
m_introns.front().m_sig.substr(2,2);
84 if(
a.Strand() ==
ePlus) {
95 if(
a.Strand() ==
ePlus)
104 CAlignMapamap(
a.Exons(),
a.FrameShifts(),
a.Strand());
118 if(
a.m_range ==
b.m_range)
120 else if(
a.m_range.GetFrom() !=
b.m_range.GetFrom())
121 return a.m_range.GetFrom() <
b.m_range.GetFrom();
123 return a.m_range.GetTo() >
b.m_range.GetTo();
128 return a.m_target_id <
b.m_target_id;
155 for(
int i= 1;
i< (
int)e.size(); ++
i) {
156 if(e[
i-1].m_ssplice && e[
i].m_fsplice) {
159sig = e[
i-1].m_ssplice_sig+e[
i].m_fsplice_sig;
161sig = e[
i].m_fsplice_sig+e[
i-1].m_ssplice_sig;
174 if(ri != right_exon_ends.
end())
177 if(ri != right_exon_ends.
begin())
182 if(li != left_exon_ends.
end())
196arg_desc->
AddFlag(
"filtersr",
"Filter SR");
197arg_desc->
AddFlag(
"filterest",
"Filter EST");
198arg_desc->
AddFlag(
"no_lr_only_introns",
"Filter introns supported only by LR");
199arg_desc->
AddFlag(
"filtermrna",
"Filter mRNA");
200arg_desc->
AddFlag(
"filterprots",
"Filter proteins");
201arg_desc->
AddFlag(
"collapsest",
"Collaps EST");
202arg_desc->
AddFlag(
"collapssr",
"Collaps SR");
203arg_desc->
AddFlag(
"fillgenomicgaps",
"Use provided selfspecies cDNA for genomic gap filling");
205arg_desc->
AddDefaultKey(
"max-extension",
"MaxExtension",
206 "Maximal extension for one-exon collapsed alignments",
209arg_desc->
AddDefaultKey(
"min-consensus-support",
"MinConsensusSupport",
210 "Minimal number of support for consensus intron",
213arg_desc->
AddDefaultKey(
"min-non-consensussupport",
"MinNonconsensusSupport",
214 "Minimal number of support for non-consensus intron",
217arg_desc->
AddDefaultKey(
"high-identity",
"HighIdentity",
218 "Minimal exon identity threshold for accepted introns",
221arg_desc->
AddDefaultKey(
"min-support-fraction",
"MinSupportFraction",
222 "Minimal splice expression relative exon expression",
225arg_desc->
AddDefaultKey(
"end-pair-support-cutoff",
"EndPairSupportCutoff",
226 "Minimal expression relative to the mean for introns with the same splice",
235arg_desc->
AddDefaultKey(
"min-edge-coverage",
"MinEdgeCoverage",
236 "Minimal absolute expression for accepted single-exon alignments without polyA/Cap",
239arg_desc->
AddDefaultKey(
"sharp-boundary",
"SharpBoundary",
240 "Minimal relative expression for crossing splice",
244arg_desc->
AddFlag(
"use-long-read-tss",
"Treat 5' ends of long reads like CAGE");
249 #define MAX_DIST_TO_FLANK_GAP 10000 265 intlength (sv.
size());
276 for(
int i= from;
i<=to; ++
i) {
281++current_gap->second;
297 if(nofilteringcollapsing) {
315 m_minident= args[
"high-identity"].AsDouble();
317 if(
m_scope!= 0 && contig !=
"") {
328 #define COVERED_FRACTION 0.75 333 intcovered_length = 0;
335 for(
intp =
i->Limits().GetFrom(); p <= i->Limits().GetTo(); ++p)
336 if(coverage[p-left_end] >= mincoverage)
344 SIntronintron_oriented_nosig(
a,
b, strand,
true,
"");
346 boolgood_intron = (introns.
find(intron_oriented_nosig) != introns.
end() || introns.
find(intron_notoriented_nosig) != introns.
end());
347 if(!good_intron && check_introns_on_both_strands) {
349good_intron = (introns.
find(intron_otherstrand_nosig) != introns.
end());
356 #define END_PART_LENGTH 35 358 #define EXON_TO_SKIP 10 363 for(
int i= e->GetFrom(); i <= e->GetTo(); ++
i) {
370 doublethreshold =
max(clip_threshold*cov, min_lim);
377 if(++exnl == (
int)align.
Exons().size()) {
381left_lim = align.
Exons()[exnl].GetFrom();
385 intexnr = (
int)align.
Exons().size()-1;
393right_lim = align.
Exons()[exnr].GetTo();
396 _ASSERT(right_lim >= left_lim);
408 for(
int i= e->GetFrom(); i <= e->GetTo(); ++
i) {
415 doublelim =
max(clip_threshold*cov, min_lim);
422 intnot_aligned_left = tlim.
GetFrom();
425 swap(not_aligned_left,not_aligned_right);
427 if(not_aligned_left > 30) {
431 if(
l< align.
Exons()[ie].GetTo())
434 l= align.
Exons()[++ie].GetFrom();
447 if(not_aligned_right > 30) {
449 intie = (
int)align.
Exons().size()-1;
451 if(
r> align.
Exons()[ie].GetFrom())
454 r= align.
Exons()[--ie].GetTo();
469 boolkeepdoing =
true;
472 for(
intk = 1; k < (
int)align.
Exons().size(); ++k) {
479 if(
l!= exonl.
GetTo())
510 for(
intprev_exon = -1; prev_exon < (
int)align.
Exons().size()-1; ++prev_exon) {
511 intpiece_begin = prev_exon+1;
512 if(align.
Exons()[piece_begin].m_fsplice)
514 intpiece_end = piece_begin;
515 for( ; piece_end < (
int)align.
Exons().size() && align.
Exons()[piece_end].m_ssplice; ++piece_end);
516 int a= align.
Exons()[piece_begin].GetFrom();
517 int b= align.
Exons()[piece_end].GetTo();
550 #define CUT_MARGIN 15 556 boolkeepdoing =
true;
559 for(
intk = 1; k < (
int)align.
Exons().size(); ++k) {
605 for(CAlignModel::TExons::const_iterator piece_begin = align.
Exons().begin(); piece_begin != align.
Exons().end(); ++piece_begin) {
606 _ASSERT( !piece_begin->m_fsplice );
608CAlignModel::TExons::const_iterator piece_end = piece_begin;
609 for( ; piece_end != align.
Exons().end() && piece_end->m_ssplice; ++piece_end) ;
616 intnew_left =
a.Limits().GetFrom();
617 for(
intk = 1; k < (
int)
a.Exons().size(); ++k) {
625 intnew_right =
a.Limits().GetTo();
626 for(
intk = (
int)
a.Exons().size()-1; k > 0 &&
a.Exons()[k-1].GetTo() > new_left; --k) {
632new_right = exonl.
GetTo();
636 if(new_lim !=
a.Limits()) {
642 if(!editedmodel.
Exons().empty())
646editedmodel.
AddExon(e->Limits(), e->m_fsplice_sig, e->m_ssplice_sig, e->m_ident);
648editedmodel.
FrameShifts().insert(editedmodel.
FrameShifts().end(),
a.FrameShifts().begin(),
a.FrameShifts().end());
650piece_begin = piece_end;
655 boolgood_alignment =
true;
657good_alignment =
false;
660 boolkeepdoing =
true;
663 for(
intk = 1; k < (
int)editedmodel.
Exons().size() && good_alignment; ++k) {
676good_alignment =
false;
682vector<TSignedSeqRange> transcript_exons;
686transcript_exons.push_back(te);
709 returngood_alignment;
712 #define MISM_PENALTY 10 713 #define INDEL_PENALTY 20 715 #define BIG_NOT_ALIGNED 20 718 stringtranscript = trans;
723 _ASSERT(tlen == (
int)transcript.size());
727vector<TSignedSeqRange> transcript_exons;
728transcript_exons.reserve(exons.size());
729 for(
intie = 0; ie < (
int)exons.size(); ++ie) {
733 for(
intie = 0; ie < (
int)exons.size(); ++ie) {
738 for(
intie = 0; ie < (
int)exons.size(); ++ie) {
739 if(!exons[ie].m_fsplice) {
740 intglim = (ie > 0) ? exons[ie-1].GetTo() : -1;
741 inttlim = (ie > 0) ? transcript_exons[ie-1].GetTo() : -1;
742 int g= exons[ie].GetFrom();
743 int t= transcript_exons[ie].GetFrom();
744 while(
g> glim+1 &&
t> tlim+1 && transcript[
t-1] ==
m_contig[
g-1]) {
748 if(
g< exons[ie].GetFrom()) {
749exons[ie].AddFrom(
g-exons[ie].GetFrom());
750exons[ie].m_fsplice_sig.clear();
751transcript_exons[ie].SetFrom(
t);
754 if(!exons[ie].m_ssplice) {
756 inttlim = (ie+1 < (
int)exons.size()) ? transcript_exons[ie+1].GetFrom() : (
int)transcript.size();
757 int g= exons[ie].GetTo();
758 int t= transcript_exons[ie].GetTo();
759 while(
g< glim-1 &&
t< tlim-1 && transcript[
t+1] ==
m_contig[
g+1]) {
763 if(
g> exons[ie].GetTo()) {
764exons[ie].AddTo(
g-exons[ie].GetTo());
765exons[ie].m_ssplice_sig.clear();
766transcript_exons[ie].SetTo(
t);
774vector<TSignedSeqRange> edited_transcript_exons;
776 for(
intpiece_begin = 0; piece_begin < (
int)exons.size(); ++piece_begin) {
777 _ASSERT( !exons[piece_begin].m_fsplice );
778 intpiece_end = piece_begin;
779 for( ; exons[piece_end].m_ssplice; ++piece_end);
780 _ASSERT(piece_end < (
int)exons.size());
782 TInDelsindels = align.
GetInDels(exons[piece_begin].GetFrom(), exons[piece_end].GetTo(),
false);
783TInDels::const_iterator indl = indels.begin();
787 TIVecexons_to_align;
788 inttp = transcript_exons[piece_begin].GetFrom();
789 for(
intie = piece_begin; ie <= piece_end; ++ie) {
791 while(gp <= exons[ie].GetTo()) {
792 if(indl == indels.end() || indl->Loc() != gp) {
793tseq.push_back(transcript[tp++]);
795}
else if(indl->IsDeletion()) {
796tseq += transcript.substr(tp,indl->Len());
797gseq.insert(gseq.end(),indl->Len(),
'-');
801tseq.insert(tseq.end(),indl->Len(),
'-');
807 if(indl != indels.end() && indl->Loc() == gp) {
809tseq += transcript.substr(tp,indl->Len());
810gseq.insert(gseq.end(), indl->Len(),
'-');
814exons_to_align.push_back((
int)gseq.size()-1);
816 _ASSERT(tseq.size() == gseq.size() && indl == indels.end());
818 TIVecscore(tseq.size());
819 for(
int i= 0;
i< (
int)score.size(); ++
i) {
820 if(tseq[
i] == gseq[
i] && tseq[
i] !=
'N')
822 else if(tseq[
i] ==
'-'|| gseq[
i] ==
'-')
827score[
i] += score[
i-1];
828score[
i] =
max(0,score[
i]);
831 intalign_right = (
int)(max_element(score.begin(),score.end())-score.begin());
833 if(score[align_right] > 0) {
834 intalign_left = align_right;
835 while(align_left > 0 && score[align_left-1] > 0)
838 intagaps = (
int)
count(tseq.begin(), tseq.begin()+align_left,
'-');
839 intbgaps = (
int)
count(tseq.begin(), tseq.begin()+align_right,
'-');
840 TSignedSeqRangetrange(transcript_exons[piece_begin].GetFrom()+align_left-agaps, transcript_exons[piece_begin].GetFrom()+align_right-bgaps);
845 int pb= piece_begin;
846 while(exons[
pb].GetTo() < grange.
GetFrom())
849 while(exons[pe].GetFrom() > grange.
GetTo())
855 for(
int i= align_left;
i<= (pe >
pb? exons_to_align[
pb-piece_begin] : align_right); ++
i) {
857 if(tseq[
i] == gseq[
i])
864 for(
int i= align_right;
i>= (pe >
pb? exons_to_align[pe-1-piece_begin]+1 : align_left); --
i) {
866 if(tseq[
i] == gseq[
i])
871 for(
intie =
pb; ie <= pe; ++ie) {
884 t.SetTo(trange.
GetTo());
889edited_exons.push_back(e);
890edited_transcript_exons.push_back(
t);
893piece_begin = piece_end;
901 for(
intpiece_begin = 0; piece_begin < (
int)edited_exons.size(); ++piece_begin) {
902 _ASSERT( !edited_exons[piece_begin].m_fsplice );
903 intpiece_end = piece_begin;
904 for( ; edited_exons[piece_end].m_ssplice; ++piece_end);
905 _ASSERT(piece_end < (
int)edited_exons.size());
911 intdistance_to_lgap = -1;
915distance_to_lgap = elim.
GetFrom()-(igap->first+igap->second);
917 if(distance_to_lgap == 0) {
918edited_exons[piece_begin].m_fsplice_sig =
"NN";
919}
else if(tlim.
GetFrom() >
BIG_NOT_ALIGNED&& (piece_begin == 0 || tlim.
GetFrom() > edited_transcript_exons[piece_begin-1].GetTo()+1)) {
920 stringsplice = (align.
Strand() ==
ePlus) ?
"AG":
"AC";
927 if(indl->IsDeletion() &&
Include(elim, indl->Loc()))
928del_len += indl->Len();
930 doubleerrors = (1.-edited_exons[piece_begin].m_ident)*(elim.
GetLength()+del_len);
932edited_exons[piece_begin].m_ident = 1.-errors/(elim.
GetLength()+del_len);
935edited_exons[piece_begin].m_fsplice_sig = splice;
946 intdistance_to_rgap = -1;
949distance_to_rgap = igap->first-elim.
GetTo()-1;
950 if(distance_to_rgap == 0) {
951edited_exons[piece_end].m_ssplice_sig =
"NN";
952}
else if(tlen-tlim.
GetTo()-1 >
BIG_NOT_ALIGNED&& (piece_end == (
int)edited_exons.size()-1 || tlim.
GetTo() < edited_transcript_exons[piece_end+1].GetFrom()-1)) {
953 stringsplice = (align.
Strand() ==
ePlus) ?
"GT":
"CT";
960 if(indl->IsDeletion() &&
Include(elim, indl->Loc()))
961del_len += indl->Len();
963 doubleerrors = (1.-edited_exons[piece_end].m_ident)*(elim.
GetLength()+del_len);
965edited_exons[piece_end].m_ident = 1.-errors/(elim.
GetLength()+del_len);
968edited_exons[piece_end].m_ssplice_sig = splice;
977 for(
intie = piece_begin; ie <= piece_end; ++ie) {
983 if(indl->Loc() > edited_exons[piece_begin].GetFrom() && indl->Loc() < edited_exons[piece_end].GetTo())
984edited_indels.push_back(*indl);
987piece_begin = piece_end;
991 for(
intie = 0; ie < (
int)edited_transcript_exons.size(); ++ie) {
1001align = editedalign;
1007 if(indl->IsMismatch() || !indl->IntersectingWith(
a,
b))
1009 if(indl->IsInsertion())
1032 size_tcount_m_aligns = 0;
1034 ITERATE(deque<SAlignIndividual>, k,
i->second) {
1036right_end =
max(right_end, k->m_range.GetTo());
1042TAlignModelList::iterator
i= it++;
1052 const SIntron& intron = it->first;
1059right_end =
max(right_end,
b);
1064right_end =
max(right_end,
i->Limits().GetTo());
1072map<TSignedSeqRange, tuple<double,bool>> intervals;
1074 const SIntron& intron = it->first;
1076 auto& rslt = intervals[intron.
m_range];
1077get<0>(rslt) +=
data.m_weight;
1078 boolnot_long =
data.m_sr_support > 0 ||
data.m_other_support > 0;
1080get<1>(rslt) =
true;
1083multimap<int, TAlignIntrons::iterator> left_intronsp;
1084multimap<int, TAlignIntrons::iterator> right_intronsp;
1086 const SIntron& intron = it->first;
1087 if(!get<1>(intervals[intron.
m_range])) {
1089right_intronsp.emplace(intron.
m_range.
GetTo(), it);
1093set<SIntron> deleted_introns;
1095 for(
auto& interval : intervals) {
1097 autoil = left_intronsp.lower_bound(range.
GetFrom()-
delta);
1098 if(il == left_intronsp.end() || il->first > range.
GetFrom()+
delta)
1100 autoir = left_intronsp.upper_bound(range.
GetFrom()+
delta);
1101set<TAlignIntrons::value_type*> close_lefts;
1102 for(
auto i= il;
i!= ir; ++
i) {
1103 const SIntron& intronb =
i->second->first;
1104 if(intronb.
m_range!= range)
1105close_lefts.insert(&(*
i->second));
1107 if(close_lefts.empty())
1110 autojl = right_intronsp.lower_bound(range.
GetTo()-
delta);
1111 if(jl == right_intronsp.end() || jl->first > range.
GetTo()+
delta)
1113 autojr = right_intronsp.upper_bound(range.
GetTo()+
delta);
1114set<TAlignIntrons::value_type*> close_rights;
1115 for(
autoj = jl; j != jr; ++j) {
1116 const SIntron& intronb = j->second->first;
1117 if(intronb.
m_range!= range)
1118close_rights.insert(&(*j->second));
1120 if(close_rights.empty())
1123vector<TAlignIntrons::value_type*>
close(
min(close_lefts.size(),close_rights.size()),
nullptr);
1124 autoclose_end = set_intersection(close_lefts.begin(), close_lefts.end(), close_rights.begin(), close_rights.end(),
close.begin());
1125 for(
autoit =
close.begin(); it != close_end; ++it) {
1126 const SIntron& intronb = (*it)->first;
1127 if(get<0>(intervals[intronb.
m_range]) < get<0>(interval.second))
1128deleted_introns.insert(intronb);
1131 for(
auto& intron : deleted_introns) {
1138 #define COVERAGE_WINDOW 20 1143 if(
i->first.isEST() &&
i->first.GetIntrons().size() > 1)
1144factor =
i->first.GetIntrons().size();
1145 ITERATE(deque<SAlignIndividual>, k,
i->second) {
1146 float weight= k->m_weight*factor;
1151 for(
int l=
in->m_range.GetFrom()+1; l <= in->
m_range.
GetTo()-1; ++
l)
1160 for(
auto& exon : align.Exons()) {
1161 for(
int l= exon.GetFrom();
l<= exon.GetTo(); ++
l)
1166vector<double> left_coverage(
len,0.);
1168 for(
int i= 0;
i<
len; ++
i) {
1175vector<double> right_coverage(
len,0.);
1177 for(
int i=
len-1;
i>= 0; --
i) {
1186 intminconsensussupport = args[
"min-consensus-support"].AsInteger();
1187 intminnonconsensussupport = args[
"min-non-consensussupport"].AsInteger();
1191 boolbad_intron =
false;
1194 if(!
id.m_selfsp_support)
1197 if(
id.m_keep_anyway)
1200 if(intron->first.m_sig ==
"CTAC"&& intron->first.m_oriented)
1204 if(intron->first.m_sig ==
"GTAG"|| (intron->second.m_intron_num >= 3 && intron->first.m_sig ==
"GCAG")) {
1205 if(
id.m_weight < minconsensussupport)
1208 if(
id.m_weight < minnonconsensussupport)
1219 doubleminspliceexpression = args[
"min-support-fraction"].AsDouble();
1220 doubleminintronexpression = args[
"end-pair-support-cutoff"].AsDouble();
1222 typedefmultimap<int,CAlignCollapser::TAlignIntrons::iterator> TIntronsBySplice;
1223TIntronsBySplice introns_by_left_splice;
1227 for(TIntronsBySplice::iterator
a= introns_by_left_splice.begin();
a!= introns_by_left_splice.end(); ) {
1228 intsplice =
a->first;
1229TIntronsBySplice::iterator
b= introns_by_left_splice.upper_bound(splice);
1233 for(TIntronsBySplice::iterator
i=
a;
i!=
b; ++
i) {
1235 weight+=
i->second->second.m_weight*
i->second->second.m_intron_num;
1239 for(TIntronsBySplice::iterator it =
a; it !=
b; ) {
1240TIntronsBySplice::iterator
i= it++;
1242 if(!
id.m_keep_anyway && (
id.m_weight*
id.m_intron_num < minintronexpression*mean ||
weight< minspliceexpression*left_coverage[splice-
m_left_end])) {
1244introns_by_left_splice.erase(
i);
1251TIntronsBySplice introns_by_right_splice;
1255 for(TIntronsBySplice::iterator
a= introns_by_right_splice.begin();
a!= introns_by_right_splice.end(); ) {
1256 intsplice =
a->first;
1257TIntronsBySplice::iterator
b= introns_by_right_splice.upper_bound(splice);
1261 for(TIntronsBySplice::iterator
i=
a;
i!=
b; ++
i) {
1263 weight+=
i->second->second.m_weight*
i->second->second.m_intron_num;
1267 for(TIntronsBySplice::iterator it =
a; it !=
b; ) {
1268TIntronsBySplice::iterator
i= it++;
1270 if(!
id.m_keep_anyway && (
id.m_weight*
id.m_intron_num < minintronexpression*mean ||
weight< minspliceexpression*right_coverage[splice-
m_left_end])) {
1272introns_by_right_splice.erase(
i);
1281 if(intron->second.m_weight < 0) {
1296 if(introns.empty())
1299 boolall_good =
true;
1300 for(
int i= 0; all_good &&
i< (
int)introns.size(); ++
i) {
1310 for(
unsigned int l= 1;
l< e.size(); ++
l) {
1313e[
l-1].m_ssplice =
false;
1314e[
l].m_fsplice =
false;
1318 for(
auto&
a: aligns) {
1321 if(
a.Exons().size() > 1) {
1334 doublemincrossexpression = args[
"sharp-boundary"].AsDouble();
1340 const SIntron& intron = intron_data.first;
1348 if(right_coverage[
a+1-
m_left_end] < mincrossexpression*two_side_exon_coverage) {
1350 data.m_not_cross =
true;
1354 data.m_not_cross =
true;
1360 if(left_coverage[
b-1-
m_left_end] < mincrossexpression*two_side_exon_coverage) {
1362 data.m_not_cross =
true;
1366 data.m_not_cross =
true;
1374 for(
int i= 1;
i<
len; ++
i) {
1375right_plus[
i] =
max(right_plus[
i],right_plus[
i-1]);
1376right_minus[
i] =
max(right_minus[
i],right_minus[
i-1]);
1378 for(
int i=
len-2;
i>= 0; --
i) {
1379left_plus[
i] =
min(left_plus[
i],left_plus[
i+1]);
1380left_minus[
i] =
min(left_minus[
i],left_minus[
i+1]);
1383 doubleclip_threshold = args[
"utrclipthreshold"].AsDouble();
1387deque<SAlignIndividual>& aligns =
data->second;
1397 autoexnum = align.
Exons().size();
1402 if(align.
Limits() == lim)
1412 if(exnum != align.
Exons().size() || cap_polya0 != cap_polya1) {
1413 if(align.
Exons().size() > 1 || exnum == 1) {
1420 i->m_range = align.
Limits();
1429 intminsingleexpression = args[
"min-edge-coverage"].AsInteger();
1430 inttrim = args[
"trim"].AsInteger();
1436deque<SAlignIndividual>& aligns =
data->second;
1443 int a=
i->m_range.GetFrom()+trim;
1444 int b=
i->m_range.GetTo()-trim;
1461 if(align.
Exons().front().Limits().GetLength() > trim) {
1462 int a= align.
Exons().front().Limits().GetFrom()+trim;
1463 int b= align.
Exons().front().Limits().GetTo();
1470 if(align.
Exons().back().Limits().GetLength() > trim) {
1471 int a= align.
Exons().back().Limits().GetFrom();
1472 int b= align.
Exons().back().Limits().GetTo()-trim;
1479 i->m_range = new_lim;
1482 for(
int n= 1;
n< (
int)align.
Exons().size()-1 &&
i->m_weight > 0; ++
n) {
1483 int a= align.
Exons()[
n].Limits().GetFrom();
1484 int b= align.
Exons()[
n].Limits().GetTo();
1486pair<TIntronsBySplice::iterator,TIntronsBySplice::iterator> eqr(introns_by_right_splice.end(),introns_by_right_splice.end());
1488eqr = introns_by_right_splice.equal_range(right_plus[
b-
m_left_end]);
1490eqr = introns_by_right_splice.equal_range(right_minus[
b-
m_left_end]);
1491 for(TIntronsBySplice::iterator
ip= eqr.first;
ip!= eqr.second; ++
ip) {
1492 if(
ip->second->first.m_range.GetFrom() >
a)
1499 if(aligns.empty()) {
1512deque<SAlignIndividual>& aligns_ind =
data->second;
1517 if(introns.empty()) {
1519 int a= ali.m_range.GetFrom();
1520 int b= ali.m_range.GetTo();
1521 if(ali.m_range.GetLength() > 2*trim) {
1535strands.push_back(
ePlus);
1536strands.push_back(
eMinus);
1542 for(
intstrand : strands) {
1543 for(
int i= 0;
i< (
int)introns.size()-1; ++
i) {
1547 if(
Include(exon,
ip->first.m_range) &&
ip->second.m_not_cross)
1555 boolsave_and_delete =
false;
1558 int a= ali.m_range.GetFrom();
1559 int b= introns.front().m_range.GetFrom();
1563save_and_delete =
true;
1569save_and_delete =
true;
1573 a= introns.back().m_range.GetTo();
1574 b= ali.m_range.GetTo();
1578save_and_delete =
true;
1583save_and_delete =
true;
1586 if(!save_and_delete)
1587ali.m_range = new_lim;
1590 for(
intstrand : strands) {
1594 if(
Include(exon,
ip->first.m_range) &&
ip->second.m_not_cross)
1599 for(
intstrand : strands) {
1603 if(
Include(exon,
ip->first.m_range) &&
ip->second.m_not_cross)
1604bad_exons.
insert(introns.size());
1608 if(save_and_delete || !bad_exons.
empty()) {
1610 if(new_lim != align.
Limits())
1613 if(!bad_exons.
empty()) {
1615 for(
unsigned i: bad_exons) {
1617e[
i-1].m_ssplice =
false;
1618e[
i].m_fsplice =
false;
1619e[
i].m_ssplice =
false;
1620 if(
i!= introns.size())
1621e[
i+1].m_fsplice =
false;
1624 for(
auto&
a: aligns) {
1625 if(
a.Exons().size() > 1) {
1643 if(aligns_ind.empty()) {
1651total +=
a.second.size();
1657TAlignModelList::iterator
i= it++;
1688 boolgood_alignment =
true;
1701 if(reversed.
Exons().size() > align.
Exons().size()) {
1703good_alignment = good_reversed_alignment;
1708 if(!align.
Exons().empty())
1731 if(indl->IsDeletion()) {
1735 for(
intp = indl->Loc(); p < indl->
Loc()+indl->Len(); ++p)
1743TAlignModelList::iterator
i= it++;
1753 int b=
min(right_end, ie->GetTo());
1754 for(
intp =
a; p <=
b; ++p) {
1764 typedefpair<TSignedSeqRange,TInDels> TGapEnd;
1765set<TGapEnd> right_gends;
1766set<TGapEnd> left_gends;
1769 #define DESIRED_CHUNK 100 1772TAlignModelList::iterator
i= it++;
1784left_gends.insert(TGapEnd(ie->Limits(),fs));
1785right_gends.insert(TGapEnd(ie->Limits(),fs));
1790 if(editedalign.
Exons().size() > align.
Exons().size()) {
1797 if(align.
Exons().front().Limits().GetLength() >
MIN_EXON) {
1801 int len=
l.GetLength();
1807 if(
a.Exons()[ie+1].m_ssplice) {
1808 l.SetTo(
a.Exons()[ie+1].GetTo());
1809 len+=
a.Exons()[ie+1].Limits().GetLength();
1815 l=
a.GetAlignMap().ShrinkToRealPoints(
l,
false);
1816 if(
l.NotEmpty()) {
1819 if(editedalign.
Exons().size() >
a.Exons().size()) {
1825 for(
intie = 0; ie < (
int)align.
Exons().size()-1; ++ie) {
1826 if((!align.
Exons()[ie].m_ssplice || !align.
Exons()[ie+1].m_fsplice) &&
1830 intleft =
a.Exons()[ie].GetFrom();
1831 int len=
a.Exons()[ie].Limits().GetLength();
1837 if(
a.Exons()[iie-1].m_fsplice) {
1838left =
a.Exons()[iie-1].GetFrom();
1839 len+=
a.Exons()[iie-1].Limits().GetLength();
1844 intright =
a.Exons()[ie+1].GetTo();
1845 len=
a.Exons()[ie+1].Limits().GetLength();
1851 if(
a.Exons()[iie+1].m_ssplice) {
1852right =
a.Exons()[iie+1].GetTo();
1853 len+=
a.Exons()[iie+1].Limits().GetLength();
1858 if(left >= 0 && right >= 0) {
1860 l=
a.GetAlignMap().ShrinkToRealPoints(
l,
false);
1861 if(
l.NotEmpty()) {
1864 if(editedalign.
Exons().size() >
a.Exons().size()) {
1872 if(align.
Exons().back().Limits().GetLength() >
MIN_EXON) {
1876 int len=
l.GetLength();
1882 if(
a.Exons()[ie-1].m_fsplice) {
1883 l.SetFrom(
a.Exons()[ie-1].GetFrom());
1884 len+=
a.Exons()[ie-1].Limits().GetLength();
1890 l=
a.GetAlignMap().ShrinkToRealPoints(
l,
false);
1891 if(
l.NotEmpty()) {
1894 if(editedalign.
Exons().size() >
a.Exons().size()) {
1904 enumEnpPoint {
eUnknown= 0, eRightPlus = 1, eRightMinus = 2, eLeftPlus = 4, eLeftMinus = 8};
1905vector<unsigned char> end_status(
len, 0);
1910 for(
intie = 0; ie < (
int)align.
Exons().size(); ++ie) {
1911 if(align.
Exons()[ie].Limits().Empty()) {
1913 int a= align.
Exons()[ie-1].GetTo();
1916 if(
a< right_end) {
1919end_status[al] |= eLeftPlus;
1922left_minus[al] =
a;
1923end_status[al] |= eLeftMinus;
1927 if(ie < (
int)align.
Exons().size()-1) {
1928 int b= align.
Exons()[ie+1].GetFrom();
1933right_plus[bl] =
b;
1934end_status[bl] |= eRightPlus;
1937right_minus[bl] =
b;
1938end_status[bl] |= eRightMinus;
1946 for(
int i= 1;
i<
len; ++
i) {
1947right_plus[
i] =
max(right_plus[
i],right_plus[
i-1]);
1948right_minus[
i] =
max(right_minus[
i],right_minus[
i-1]);
1950 for(
int i=
len-2;
i>= 0; --
i) {
1951left_plus[
i] =
min(left_plus[
i],left_plus[
i+1]);
1952left_minus[
i] =
min(left_minus[
i],left_minus[
i+1]);
1957 #define MAX_CLIP 200 1958 #define SMALL_CLIP 30 1962TAlignModelList::iterator
i= it++;
1978 boolgood_alignment =
true;
1980 boolkeepdoing =
true;
1981 while(keepdoing && good_alignment) {
1983 for(
intie = 0; ie < (
int)align.
Exons().size(); ++ie) {
1996rights = &right_plus;
2001rights = &right_minus;
2010 intfirstclip = new_l;
2014 if(ig->first.GetFrom() <= putativel && ig->first.GetTo() >= firstclip) {
2017 if(prot_fs == tsa_fs)
2024 for(
int i= 0;
i< (
int)pindels.size() && pindels[
i].Loc() <= new_l+
FS_FUZZ; ++
i)
2025new_l =
max(new_l,pindels[
i].
Loc());
2032good_alignment =
false;
2039good_alignment =
false;
2073lefts = &left_minus;
2082 intfirstclip = new_r;
2086 if(ig->first.GetFrom() <= firstclip && ig->first.GetTo() >= putativer) {
2089 if(prot_fs == tsa_fs)
2096 for(
int i= (
int)pindels.size()-1;
i>= 0 && pindels[
i].Loc() >= new_r-
FS_FUZZ; --
i)
2097new_r =
min(new_r,pindels[
i].
Loc()-1);
2104good_alignment =
false;
2111good_alignment =
false;
2116 if(ie == (
int)align.
Exons().size()-1) {
2132 if(!good_alignment)
2141cerr <<
"After filtering: "<<
m_align_introns.
size() <<
" introns, "<< total <<
" alignments"<< endl;
2147 if(
i->Limits().NotEmpty()) {
2151 if(ig->GetSource().m_range.NotEmpty())
2163 bool operator()(TAlignModelList::const_iterator
a, TAlignModelList::const_iterator
b) {
2164 if(
a->Limits() ==
b->Limits()) {
2165 if(
a->Ident() !=
b->Ident())
2166 return a->Ident() >
b->Ident();
2168 return a->TargetAccession() <
b->TargetAccession();
2169}
else if(
a->Limits().GetFrom() !=
b->Limits().GetFrom()) {
2170 return a->Limits().GetFrom() <
b->Limits().GetFrom();
2172 return a->Limits().GetTo() >
b->Limits().GetTo();
2181 if(!
a.m_seq.empty() || !
b.m_seq.empty()) {
2182 return a.m_seq <
b.m_seq;
2183}
else if(
b.Limits().Empty()) {
2185}
else if(
a.Limits().Empty()) {
2187}
else if(
a.m_fsplice !=
b.m_fsplice) {
2188 return a.m_fsplice <
b.m_fsplice;
2189}
else if(
a.m_ssplice !=
b.m_ssplice) {
2190 return a.m_ssplice <
b.m_ssplice;
2192 return a.Limits() <
b.Limits();
2199 if(
a.size() !=
b.size()) {
2200 return a.size() <
b.size();
2202 for(
int i= 0;
i< (
int)
a.size(); ++
i) {
2232cerr <<
"Added "<<
m_count<<
" alignments to collapser for contig "<<
m_contig_name<< endl;
2241 intoep = args[
"oep"].AsInteger();
2242 intmax_extend = args[
"max-extension"].AsInteger();
2244 set<int>left_exon_ends, right_exon_ends;
2246 const SIntron& intron = it->first;
2250right_exon_ends.
insert(
a);
2257deque<SAlignIndividual>& alideque =
i->second;
2261 ITERATE(deque<SAlignIndividual>, k, alideque) {
2263rnaseq_or_est.push_back(align);
2268 boolnotspliced = alc.
GetIntrons().empty();
2270 typedeflist<SAlignExtended> TEA_List;
2271TEA_List extended_aligns;
2275 boolcollapsed =
false;
2277 for(TEA_List::iterator itloop = extended_aligns.begin(); itloop != extended_aligns.end(); ) {
2278TEA_List::iterator ita = itloop++;
2283rnaseq_or_est.push_back(align);
2284extended_aligns.erase(ita);
2285}
else if(!collapsed) {
2291 if(aj.
m_range.
GetTo()-ita->m_initial_right_end > max_extend)
2307extended_aligns.push_back(
SAlignExtended(aj,left_exon_ends,right_exon_ends));
2310 ITERATE(TEA_List, ita, extended_aligns) {
2312rnaseq_or_est.push_back(align);
2324 TIntMap* mp = (align.
Strand() ==
ePlus) ? &strandedplus_len : &strandedminus_len;
2325 if(mp->
empty() || mp->rbegin()->first+mp->rbegin()->second < align.
Limits().
GetFrom()) {
2328mp->rbegin()->second =
max(mp->rbegin()->second, align.
Limits().
GetTo()-mp->rbegin()->first+1);
2333 intforced_orientation = 0;
2337 boolincluded_in_plus =
false;
2340included_in_plus =
true;
2341 boolincluded_in_minus =
false;
2344included_in_minus =
true;
2346 if(included_in_plus != included_in_minus) {
2349++forced_orientation;
2353cerr <<
"Forced orintation: "<< forced_orientation << endl;
2362 typedefmap<CGeneModel::TExons, vector<TAlignModelList::iterator>,
MultiExonsCompare> TEstHolder;
2363TEstHolder est_for_collapsing;
2367 if(exons.size() == 1) {
2369 _ASSERT(exons.front().m_seq.empty());
2371 if(exons.front().m_ssplice_sig !=
"XX")
2372exons.front().Limits().SetFrom(exons.front().GetTo());
2373 if(exons.back().m_fsplice_sig !=
"XX")
2374exons.back().Limits().SetTo(exons.back().GetFrom());
2376est_for_collapsing[exons].push_back(
i);
2382list<TAlignModelList::iterator> ests(
i->second.begin(),
i->second.end());
2383 for(list<TAlignModelList::iterator>::iterator ihost = ests.begin(); ihost != ests.end(); ++ihost) {
2387 if(ri != right_exon_ends.
begin())
2391 if(li != left_exon_ends.
end())
2394list<TAlignModelList::iterator>::iterator iloop = ihost;
2395 for(++iloop; iloop != ests.end(); ) {
2396list<TAlignModelList::iterator>::iterator iguest = iloop++;
2439 size_tflex_cap = 0;
2440 size_tflex_polya = 0;
2442 if(status_align.second.Limits().GetFrom() >= 0 && status_align.second.Limits().GetTo() <
m_contig.
FullLength() &&
CheckAndInsert(status_align.second, clsset)) {
2450cerr <<
"After collapsing: "<< total <<
" alignments "<< flex_cap <<
" Flexible caps "<< flex_polya <<
" Flexible polyas"<< endl;
2458vector<TSignedSeqRange> transcript_exons;
2461 boolchainer_tsa = (acc.find(
"ChainerTSA") != string::npos);
2463 stringleft_seq, right_seq;
2470left_seq = transcript.substr(0,tlim.
GetFrom());
2474left_src.
m_range= left_texon;
2477right_seq = transcript.substr(tlim.
GetTo()+1);
2481right_src.
m_range= right_texon;
2484 swap(left_seq, right_seq);
2485 swap(left_texon, right_texon);
2486 swap(left_src, right_src);
2489 if(!left_seq.empty() && (fill&
efill_left) != 0 && !chainer_tsa) {
2492transcript_exons.push_back(left_texon);
2503 for(
int i= 0;
i< (
int)align.
Exons().size(); ++
i) {
2515transcript_exons.push_back(texon);
2537 if(!right_seq.empty() && (fill&
efill_right) != 0 && !chainer_tsa) {
2540transcript_exons.push_back(right_texon);
2568galign.
Status() |= status;
2571 auto& stored = rslt.first->second;
2572stored.SetWeight(stored.Weight()+
weight);
2577 #define COLLAPS_CHUNK 500000 2580 stringacc =
a.TargetAccession();
2581 for(
char& c : acc)
2584 if(acc.find(
"CORRECTIONDATA") != string::npos) {
2589 if(gap->first <=
a.Limits().GetTo() && gap->first+gap->second-1 >=
a.Limits().GetFrom())
2595 TInDelscorrections =
a.FrameShifts();
2597 if(
i->IsMismatch()) {
2598 stringseq =
i->GetInDelV();
2599 for(
int l= 0;
l<
i->Len(); ++
l)
2611 if(acc.find(
"CAPINFO") != string::npos)
2613 else if(acc.find(
"POLYAINFO") != string::npos)
2620pos =
a.Limits().GetFrom();
2623pos =
a.Limits().GetTo();
2626 if(
a.Exons().size() == 1)
2630 boollong_read = acc.find(
"SRA") != string::npos && acc.find(
"RNASEQ_COLLAPSE") == string::npos;
2632 if(long_read &&
a.Exons().front().m_ident == 0) {
2633 TInDels& indels =
a.FrameShifts();
2635 autoit = indels.begin();
2637 intalign_len = exon.Limits().GetLength();
2638 doublematches = align_len;
2639 for( ;it != indels.end() && it->IntersectingWith(exon.GetFrom(), exon.GetTo()); ++it) {
2640 if(it->IsMismatch() || it->IsInsertion())
2641matches -= it->Len();
2642 if(it->IsDeletion())
2643align_len += it->Len();
2646exon.m_ident = matches/align_len;
2654 intshift =
a.TranscriptLimits().GetFrom();
2657 for(
int i= 0;
i< (
int)
a.Exons().size(); ++
i) {
2658 autote =
a.TranscriptExon(
i);
2659 stringeseq = transcript.substr(te.GetFrom()-shift, te.GetLength());
2661 if(
i== (
int)
a.Exons().size()-1) {
2664lim.
SetFrom(
a.Exons()[
i+1].GetFrom());
2665 if(
a.Exons()[
i].m_ssplice &&
a.Exons()[
i+1].m_fsplice)
2666cerr <<
"Low complexity: "<<
a.ID() <<
" "<<
m_contig_name<<
':'<<
a.Exons()[
i].GetTo()+1 <<
':'<<
a.Exons()[
i+1].GetFrom()+1 <<
' '<< eseq <<
"\n";
2672 if(lim.
Empty()) {
2673cerr <<
"Erased: "<<
a.ID() <<
"\n";
2677 for(
int i= (
int)
a.Exons().size()-1;
i> 0; --
i) {
2678 autote =
a.TranscriptExon(
i);
2679 stringeseq = transcript.substr(te.GetFrom()-shift, te.GetLength());
2681lim.
SetTo(
a.Exons()[
i-1].GetTo());
2682 if(
a.Exons()[
i-1].m_ssplice &&
a.Exons()[
i].m_fsplice)
2683cerr <<
"Low complexity: "<<
a.ID() <<
" "<<
m_contig_name<<
':'<<
a.Exons()[
i-1].GetTo()+1 <<
':'<<
a.Exons()[
i].GetFrom()+1 <<
' '<< eseq <<
"\n";
2688 if(lim !=
a.Limits()) {
2701use_alignment =
false;
2703 intnot_aligned_5p = tlim.
GetFrom();
2704 intnot_aligned_3p =
a.TargetLen()-1-tlim.
GetTo();
2706 swap(not_aligned_5p, not_aligned_3p);
2708use_alignment =
false;
2710 if(use_alignment) {
2713 if(
a.Strand() ==
ePlus) {
2714pos =
a.Limits().GetFrom();
2717pos =
a.Limits().GetTo();
2740 for(
unsigned int l= 1;
l< e.size(); ++
l) {
2741 if(e[
l-1].m_ssplice && e[
l].m_fsplice) {
2742 doubleident =
min(e[
l-1].m_ident, e[
l].m_ident);
2750sig = e[
l-1].m_ssplice_sig+e[
l].m_fsplice_sig;
2752sig = e[
l].m_fsplice_sig+e[
l-1].m_ssplice_sig;
2761 id.m_keep_anyway =
true;
2766e[
l-1].Limits().GetLength() > 15 && e[
l-1].m_ident > 0.99 &&
2767e[
l].Limits().GetLength() > 15 && e[
l].m_ident > 0.99)) {
2769 id.m_selfsp_support =
true;
2773 id.m_sr_support += align.
Weight()+0.5;
2775 id.m_est_support += align.
Weight()+0.5;
2777 id.m_other_support += align.
Weight()+0.5;
2779 id.m_intron_num =
max(
id.m_intron_num, (
int)e.size()-1);
2780 id.m_weight += align.
Weight();
2782 id.m_ident =
max(
id.m_ident,ident);
2792 if(
a.Strand() ==
ePlus) {
2793pos =
a.Limits().GetFrom();
2796pos =
a.Limits().GetTo();
2804 if(
a.Strand() ==
eMinus) {
2805pos =
a.Limits().GetFrom();
2808pos =
a.Limits().GetTo();
2834cerr <<
"Added "<<
m_count<<
" alignments to collapser"<< endl;
2841deque<SAlignIndividual>& alideque =
i->second;
2843 if(!alideque.empty()) {
2847deque<SAlignIndividual>::iterator ali = alideque.begin();
2848 for(deque<SAlignIndividual>::iterator farp = ali+1; farp != alideque.end(); ++farp) {
2850 if(farp->m_range == ali->m_range) {
2851ali->m_weight += farp->m_weight;
2852 for(deque<char>::iterator p = id_pool.begin()+farp->m_target_id; *p != 0; ++p) {
2860 _ASSERT(ali-alideque.begin()+1 <= (
int)alideque.size());
2861alideque.resize(ali-alideque.begin()+1);
2867deque<char>::iterator
id= id_pool.begin();
2869ali = alideque.begin();
2870 for(deque<char>::iterator farp =
id; farp != id_pool.end(); ) {
2871 while(farp != id_pool.end() && *farp == 0) {
2875 if(farp != id_pool.end()) {
2877 if(farp-id_pool.begin() == ali->m_target_id) {
2878ali->m_target_id -= shift;
2879 _ASSERT(ali->m_target_id >= 0);
2885 while(*farp != 0) {
2891id_pool.resize(
id-id_pool.begin());
2893 _ASSERT(ali == alideque.end());
bool OneExonCompare(const CModelExon &a, const CModelExon &b)
bool OriginalOrder(const SAlignIndividual &a, const SAlignIndividual &b)
bool isGoodIntron(int a, int b, EStrand strand, const CAlignCollapser::TAlignIntrons &introns, bool check_introns_on_both_strands)
string GetTargetAcc(int shift, const deque< char > &id_pool)
int TotalFrameShift(const TInDels &indels, int a, int b)
bool AlignmentMarkedForDeletion(const SAlignIndividual &ali)
#define MAX_DIST_TO_FLANK_GAP
bool AlignmentIsSupportedBySR(const CAlignModel &align, const vector< double > &coverage, int mincoverage, int left_end)
#define NOT_ALIGNED_PHONY_CAGE
#define SPECIAL_ALIGN_LEN
void remove_if(Container &c, Predicate *__pred)
TSignedSeqPos FullLength() const
void Init(const CSeqVector &sv, TSignedSeqPos from, TSignedSeqPos to)
string substr(TSignedSeqPos p, TSignedSeqPos l) const
CAlignModel FillGapsInAlignmentAndAddToGenomicGaps(const CAlignModel &align, int fill)
bool RemoveNotSupportedIntronsFromProt(CAlignModel &align)
CAlignCollapser(string contig="", CScope *scope=0, bool nofilteringcollapsing=false)
void AddAlignment(CAlignModel &align)
bool m_no_lr_only_introns
void InitContig(string contig, CScope *scope)
vector< double > m_coverage
map< tuple< int, TSignedSeqPos, EStrand >, CAlignModel > m_special_aligns
void ClipNotSupportedFlanks(CAlignModel &align, double clip_threshold, double min_lim=0)
bool RemoveNotSupportedIntronsFromTranscript(CAlignModel &align, bool check_introns_on_both_strands) const
void GetOnlyOtherAlignments(TAlignModelClusterSet &clsset)
bool CheckAndInsert(const CAlignModel &align, TAlignModelClusterSet &clsset) const
TAlignIntrons m_align_introns
SCorrectionData m_correction_data
void ClipESTorSR(CAlignModel &align, double clip_threshold, double min_lim)
TIntMap m_genomic_gaps_len
void GetCollapsedAlgnments(TAlignModelClusterSet &clsset)
TAlignModelList m_aligns_for_filtering_only
bool m_use_long_reads_tss
void CleanSelfTranscript(CAlignModel &align, const string &trans) const
void AddFlexible(int status, TSignedSeqPos pos, EStrand strand, Int8 id, double weight)
static void SetupArgDescriptions(CArgDescriptions *arg_desc)
CAlignModel GetAlignment(const SAlignIndividual &ali, const deque< char > &target_id_pool) const
vector< SIntron > Tintrons
const Tintrons & GetIntrons() const
TSignedSeqRange MapRangeEditedToOrig(TSignedSeqRange edited_range, bool withextras=true) const
void EditedSequence(const In &original_sequence, Out &edited_sequence, bool includeholes=false) const
TSignedSeqRange ShrinkToRealPoints(TSignedSeqRange orig_range, bool snap_to_codons=false) const
int FShiftedLen(TSignedSeqRange ab, ERangeEnd lend, ERangeEnd rend) const
TSignedSeqRange MapRangeOrigToEdited(TSignedSeqRange orig_range, ERangeEnd lend, ERangeEnd rend) const
string TargetAccession() const
virtual void Clip(TSignedSeqRange limits, EClipMode mode, bool ensure_cds_invariant=true)
CConstRef< objects::CSeq_id > GetTargetId() const
virtual void CutExons(TSignedSeqRange hole)
virtual CAlignMap GetAlignMap() const
void SetTargetId(const objects::CSeq_id &id)
void AddExon(TSignedSeqRange exon, const string &fs="", const string &ss="", double ident=0, const string &seq="", const CInDelInfo::SSource &src=CInDelInfo::SSource())
virtual void CutExons(TSignedSeqRange hole)
TSignedSeqRange TranscriptLimits() const
EStrand Orientation() const
const TExons & Exons() const
virtual CAlignMap GetAlignMap() const
TSignedSeqRange TranscriptExon(int i) const
void ReverseComplementModel()
void SetStrand(EStrand s)
TSignedSeqRange Limits() const
vector< CModelExon > TExons
TInDels GetInDels(bool fs_only) const
static CRef< CSeq_id > ToSeq_id(const string &str)
void Insert(const typename Cluster::TModel &a)
TSignedSeqPos GetFrom() const
const TSignedSeqRange & Limits() const
TSignedSeqPos GetTo() const
static CNcbiApplication * Instance(void)
Singleton method.
container_type::const_iterator const_iterator
container_type::iterator iterator
const_iterator begin() const
const_iterator end() const
const_iterator lower_bound(const key_type &key) const
iterator_bool insert(const value_type &val)
const_iterator upper_bound(const key_type &key) const
container_type::value_type value_type
const_iterator find(const key_type &key) const
iterator_bool insert(const value_type &val)
const_iterator begin() const
parent_type::iterator iterator
const_iterator upper_bound(const key_type &key) const
const_iterator end() const
const_iterator lower_bound(const key_type &key) const
parent_type::const_iterator const_iterator
struct parameters_t * pb[]
double Entropy(const string &seq)
list< CAlignModel > TAlignModelList
bool Include(TSignedSeqRange big, TSignedSeqRange small)
void ReverseComplement(const BidirectionalIterator &first, const BidirectionalIterator &last)
EStrand OtherStrand(EStrand s)
vector< CInDelInfo > TInDels
list< Model > GetAlignParts(const Model &algn, bool settrimflags)
virtual const CArgs & GetArgs(void) const
Get parsed command line arguments.
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
int TSignedSeqPos
Type for signed sequence position.
#define NON_CONST_ITERATE(Type, Var, Cont)
Non constant version of ITERATE macro.
void swap(NCBI_NS_NCBI::pair_base_member< T1, T2 > &pair1, NCBI_NS_NCBI::pair_base_member< T1, T2 > &pair2)
void AddFlag(const string &name, const string &comment, CBoolEnum< EFlagValue > set_value=eFlagHasValueIfSet, TFlags flags=0)
Add description for flag argument.
void SetCurrentGroup(const string &group)
Set current arguments group name.
void AddDefaultKey(const string &name, const string &synopsis, const string &comment, EType type, const string &default_value, TFlags flags=0, const string &env_var=kEmptyStr, const char *display_value=nullptr)
Add description for optional key with default value.
@ eDouble
Convertible into a floating point number (double)
@ eInteger
Convertible into an integer number (int or Int8)
#define NCBI_THROW(exception_class, err_code, message)
Generic macro to throw an exception, given the exception class, error code and message string.
virtual void Assign(const CSerialObject &source, ESerialRecursionMode how=eRecursive)
Optimized implementation of CSerialObject::Assign, which is not so efficient.
const CMolInfo * GetMolInfo(const CBioseq &bioseq)
Retrieve the MolInfo object for a given bioseq handle.
CBioseq_Handle GetBioseqHandle(const CSeq_id &id)
Get bioseq handle by seq-id.
CSeqVector GetSeqVector(EVectorCoding coding, ENa_strand strand=eNa_strand_plus) const
Get sequence: Iupacna or Iupacaa if use_iupac_coding is true.
@ eCoding_Iupac
Set coding to printable coding (Iupacna or Iupacaa)
bool IsInGap(TSeqPos pos) const
true if sequence at 0-based position 'pos' has gap Note: this method is not MT-safe,...
int64_t Int8
8-byte (64-bit) signed integer
position_type GetLength(void) const
bool NotEmpty(void) const
static TThisType GetEmpty(void)
CRange< TSignedSeqPos > TSignedSeqRange
static TThisType GetWhole(void)
#define END_SCOPE(ns)
End the previously defined scope.
#define BEGIN_SCOPE(ns)
Define a new scope.
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.
TTech GetTech(void) const
Get the Tech member data.
bool IsSetTech(void) const
Check if a value has been assigned to Tech data member.
@ eTech_tsa
transcriptome shotgun assembly
unsigned int
A callback function used to compare two keys in a database.
string GetDNASequence(CConstRef< objects::CSeq_id > id, CScope &scope)
constexpr auto sort(_Init &&init)
double value_type
The numeric datatype used by the parser.
Magic spell ;-) needed for some weird compilers... very empiric.
Defines command line argument related classes.
std::istream & in(std::istream &in_, double &x_)
Int4 delta(size_t dimension_, const Int4 *score_)
double r(size_t dimension_, const Int4 *score_, const double *prob_, double theta_)
static SLJIT_INLINE sljit_ins l(sljit_gpr r, sljit_s32 d, sljit_gpr x, sljit_gpr b)
bool operator()(TAlignModelList::const_iterator a, TAlignModelList::const_iterator b)
const deque< char > & id_pool
LeftAndLongFirstOrder(const deque< char > &idp)
bool operator()(const SAlignIndividual &a, const SAlignIndividual &b)
bool operator()(const CGeneModel::TExons &a, const CGeneModel::TExons &b) const
SAlignExtended(SAlignIndividual &ali, const set< int > &left_exon_ends, const set< int > &right_exon_ends)
TSignedSeqPos m_target_id
list< TSignedSeqRange > m_confirmed_intervals
map< int, char > m_replacements
TInDels m_correction_indels
int g(Seg_Gsm *spe, Seq_Mtf *psm, Thd_Gsm *tdg)
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