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       //void reverse() { set(e, b); }
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                 // output in a row
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;  // begin and end
00502 
00514                 static int margin; // default 16
00517                 static float marginFraction; // default 0.1
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

Generated on Wed Aug 10 11:56:52 2011 for Softwares from Orpara by  doxygen 1.5.6