bool tMatch(GffObj& a, GffObj& b) { //strict intron chain match, or single-exon perfect match int imax=a.exons.Count()-1; int jmax=b.exons.Count()-1; int ovlen=0; if (imax!=jmax) return false; //different number of introns if (imax==0) { //single-exon mRNAs //if (equnspl) { //fuzz match for single-exon transfrags: // it's a match if they overlap at least 80% of max len ovlen=a.exons[0]->overlapLen(b.exons[0]); int maxlen=GMAX(a.covlen,b.covlen); return (ovlen>=maxlen*0.8); /*} else { //only exact match ovlen=a.covlen; return (a.exons[0]->start==b.exons[0]->start && a.exons[0]->end==b.exons[0]->end); }*/ } //check intron overlaps ovlen=a.exons[0]->end-(GMAX(a.start,b.start))+1; ovlen+=(GMIN(a.end,b.end))-a.exons.Last()->start; for (int i=1;i<=imax;i++) { if (i<imax) ovlen+=a.exons[i]->len(); if ((a.exons[i-1]->end!=b.exons[i-1]->end) || (a.exons[i]->start!=b.exons[i]->start)) { return false; //intron mismatch } } return true; }
bool tMatch(GffObj& a, GffObj& b, int& ovlen, bool fuzzunspl, bool contain_only) { //strict intron chain match, or single-exon match int imax=a.exons.Count()-1; int jmax=b.exons.Count()-1; ovlen=0; if (imax!=jmax) return false; //different number of exons if (imax==0) { //single-exon mRNAs if (contain_only) { return ((a.start>=b.start && a.end<=b.end) || (b.start>=a.start && b.end<=a.end)); } if (fuzzunspl) { //fuzz match for single-exon transfrags: // it's a match if they overlap at least 80% of longest one //ovlen=a.exons[0]->overlapLen(b.exons[0]); //int maxlen=GMAX(a.covlen,b.covlen); //return (ovlen>=maxlen*0.8); return (singleExonTMatch(a,b,ovlen)); } else { //only exact match ovlen=a.covlen; return (a.exons[0]->start==b.exons[0]->start && a.exons[0]->end==b.exons[0]->end); } } if ( a.exons[imax]->start<b.exons[0]->end || b.exons[jmax]->start<a.exons[0]->end ) return false; //intron chains do not overlap at all //check intron overlaps ovlen=a.exons[0]->end-(GMAX(a.start,b.start))+1; ovlen+=(GMIN(a.end,b.end))-a.exons.Last()->start; for (int i=1;i<=imax;i++) { if (i<imax) ovlen+=a.exons[i]->len(); if ((a.exons[i-1]->end!=b.exons[i-1]->end) || (a.exons[i]->start!=b.exons[i]->start)) { return false; //intron mismatch } } if (contain_only) return ((a.start>=b.start && a.end<=b.end) || (b.start>=a.start && b.end<=a.end)); else return true; }