Range.h
Go to the documentation of this file.00001 #ifndef RANGE_H
00002 #define RANGE_H
00003
00004 #include <iostream>
00005 #include <list>
00006
00007 using namespace std;
00008
00024 class Range {
00025 public:
00036 Range() : b(0), e(0) {}
00037 Range(int begin, int end) : b(begin), e(end) {}
00038 Range(pair<int,int> p) : b(p.first), e(p.second) { }
00039 Range(const Range &r) : b(r.b), e(r.e) {}
00046 Range(int p) : b(p), e(p) { }
00048 Range& operator=(const Range &r);
00049 ~Range() { }
00051 Range operator+(int c) const { return Range(b+c, e+c); }
00053 Range operator-(int c) const { return Range(b-c, e-c); }
00054 friend Range operator-(int c, const Range &r) { return Range(c-r.b, c-r.e); }
00055 friend Range operator+(int c, const Range &r) { return Range(c+r.b, c+r.e); }
00056 Range& operator+=(int c) { b += c; e += c; return *this; }
00057 Range& operator-=(int c) { b -= c; e -= c; return *this; }
00058
00060
00063 int begin() const { return b; }
00064 int end() const { return e; }
00068 bool empty() const { return b==0 && e==0; }
00073 virtual bool isNull() const { return b==0 && e==0; }
00074 virtual void setNull() { b=0; e=0; }
00079 int length() const;
00080 int smallerEnd() const { return b<e? b : e; }
00082 int low() const { return b<e? b : e; }
00083 int largerEnd() const { return e>b? e : b; }
00085 int high() const { return e>b? e : b; }
00093 char direction() const { return e>b? '+' : (b>e? '-' : '?'); }
00094 bool isPlus() const { return e>b; }
00095 bool isMinus() const { return e<b; }
00097 bool isPoint() const { return b==e; }
00098
00101
00111 int distance(const Range &r) const;
00112
00130 int overlap(const Range &r, bool sameDirection=true) const;
00143 int overlay(const Range &r) const;
00144
00161 float overlapFraction(const Range &r, bool sd=true) const;
00165 float overlayFraction(const Range &r) const;
00171 int plusOverlap(const Range &r) const;
00172 int minusOverlap(const Range &r) const;
00173 int plusminusOverlap(const Range &r) const;
00174 int minusplusOverlap(const Range &r) const;
00182 bool plusContain(const Range &r) const;
00187 bool minusContain(const Range &r) const;
00191 bool plusminusContain(const Range &r) const;
00195 bool minusplusContain(const Range &r) const;
00196
00208 bool contain(const Range &r, bool sameDirection=true) const;
00212 bool contain(int p) const;
00213
00218 bool inside(const Range &r) const {
00219 return min(b,e) >= min(r.b, r.e) && max(b,e) <= max(r.b, r.e);
00220 }
00235 bool similar(const Range &r, bool sameDirection=true) const;
00236
00238 bool similar(const Range &r, const int marg=20, const float frac=0.1,
00239 bool sameDirection=true) const;
00240
00254 int compare(const Range &r) const;
00255 int compare(const Range *r) const { return compare(*r); }
00262 bool less(const Range &r) const { return compare(r) == -1; }
00285 int compareDirectional(const Range &r) const;
00295 int compareByDirection(const Range &r) const;
00296
00297 bool directionalLess(const Range &r) const { return compareDirectional(r) == -1; }
00298
00302 bool sameDirection(const Range &r) const;
00310 int topology(const Range &r) const;
00311
00314 bool operator==(const Range &r) const { return b==r.b && e==r.e; }
00315 bool operator!=(const Range &r) const { return b!=r.b || e!=r.e; }
00320 bool operator<(const Range &r) const {
00321 return compare(r) == -1; }
00323 bool operator>(const Range &r) const {
00324 return compare(r) == 1; }
00364 bool lessByDirection(const Range &r) const;
00365 bool lessByDirection(const Range *r) const;
00373 bool lessByDirection(int p, char direc='+') const;
00375 bool greaterByDirection(const Range &r) const { return !lessByDirection(r); }
00376 bool greaterByDirection(const Range *r) const { return !lessByDirection(r); }
00377 bool greaterByDirection(int p) const { return !lessByDirection(p); }
00383 bool before(const Range &r) const;
00390 bool after(const Range &r) const;
00391
00393
00408 bool merge(const Range &r, bool sd=true);
00415 bool fuse(const Range &r);
00419 void forceFuse(const Range &r);
00420
00440 int combine(const Range &r);
00441
00445 void set(int be, int en) { b=be; e=en; }
00446 void set(const Range &r) { b=r.begin(); e=r.end(); }
00447 void setEnd(int en) { e=en; }
00450 void endUpdate(int len) { e += len; }
00451 void setBegin(int be) { b=be; }
00454 void beginUpdate(int len) { b += len; }
00459 Range& reverse() { set(e, b); return *this; }
00460
00464 Range getReverse() const { return Range(e,b); }
00466 Range copyReverse() const { return Range(e, b); }
00471 Range copyShrinkBothEnds(int del) const;
00473 void growEnd(int icr);
00474
00476
00482 friend ostream& operator<<(ostream &ous, const Range &r);
00483
00484 ostream& output(ostream &ous, const char delimiter[]="\t") const {
00485 ous << b << delimiter << e; return ous; }
00486 ostream& output(ostream &ous, char delim='\t') const {
00487 ous << b << delim << e; return ous; }
00489 string asDelimitedString(const char delimiter[]=",") const;
00490 string asDelimitedString(const char delimiter=',') const;
00491
00492 static void setMargin(const int mg) { margin=mg; }
00493
00494
00495 protected:
00501 int b, e;
00502
00514 static int margin;
00517 static float marginFraction;
00518 };
00519
00520
00528 bool lessRangeByDirectional(const Range *r1, const Range *r2);
00529
00538 class DRgreater {
00539 const Range *given;
00540 public:
00541 DRgreater(const Range &r) : given(&r) { }
00543 bool operator() (const Range *r2) const {
00544 return r2->greaterByDirection(given);
00545 }
00546 };
00547
00548
00564 class RangeChain : public Range {
00565 public:
00566 RangeChain() : chain(), sumolp(0) {}
00568 RangeChain(const RangeChain &ch);
00585 RangeChain(const string &raw);
00586 RangeChain(const Range &r) : sumolp(0) {
00587 chain.push_back(new Range(r)); }
00589 ~RangeChain();
00590 RangeChain& operator=(const RangeChain &rc);
00591
00612 void add(const Range &r, bool sd=true);
00619 int getOverlap() const { return sumolp; }
00623 bool exonMerge(const RangeChain &rc);
00624
00642 pair<int,int> length() const;
00646 int outerLength() const;
00649 Range outerRange() const;
00653 int sumLength() const;
00656 int exonLength() const { return sumLength(); }
00661 pair<int,int> intronLength() const;
00663 int maxIntronLength() const;
00665 int begin() const { return chain.front()->begin(); }
00667 int end() const { return chain.back()->end(); }
00670 friend ostream& operator<<(ostream &ous, const RangeChain &rc);
00679 pair<int,int> exonOverlap(const RangeChain &rc) const;
00681 int numberOfRanges() const { return chain.size(); }
00688 char direction() const;
00692 void order();
00701 ostream& tableRows(ostream &ous, const string &prefix) const;
00702
00703 typedef list<Range*>::const_iterator const_iterator;
00705 const_iterator itbegin() const { return chain.begin(); }
00706 const_iterator itend() const { return chain.end(); }
00707
00708 protected:
00714 list<Range*> chain;
00717 int sumolp;
00718 };
00719
00720 #endif