00001 #ifndef ALNRANGE_H
00002 #define ALNRANGE_H
00003
00004 #include <iostream>
00005 #include <string>
00006 #include <vector>
00007 #include <list>
00008
00009 #ifdef HAVE_PG
00010 #include "libpq++.h"
00011 #endif
00012
00013 using namespace std;
00014
00015
00016
00035 class alnrange {
00036 public:
00037 alnrange() : begin(0), end(0), score(0), ngidentity(0), cov(0) {}
00038 alnrange(const alnrange &r);
00044 alnrange(int b, int e, double s, double ng, double c)
00045 : begin(b), end(e), score(s), ngidentity(ng), cov(c) {}
00046
00047 #ifdef HAVE_PG
00048
00049 alnrange(PgDatabase* db, int i);
00050 #endif
00051
00052 virtual ~alnrange() {}
00053 alnrange& operator=(const alnrange& r);
00054
00055
00056
00057
00058
00059 bool overlap(const alnrange &r, const int margin);
00060
00061
00062 bool overlap(const alnrange &r);
00063 int length() const { return end-begin+1; }
00064 int getBegin() const { return begin; }
00065 int getEnd() const { return end; }
00066 double getScore() const { return score; }
00067 double getNg() const { return ngidentity; }
00068 double getCov() const { return cov; }
00069
00070
00071
00072
00073 virtual string asTabedString() const;
00074 virtual string asDelimitedString(char sep[]=",") const;
00075
00076 static string fields();
00077
00078
00079
00080
00081
00082 virtual string essentialInfo() const;
00083
00084 friend ostream& operator<<(ostream &ous, const alnrange& r);
00085
00086 static void setmargin(int olpcut, float olpfrac) {
00087 ovlpcut=olpcut; ovlpfraction=olpfrac; }
00088
00089 protected:
00090 int begin;
00091 int end;
00092
00094 double score;
00096 double ngidentity;
00098 double cov;
00099
00100 static int ovlpcut;
00101 static float ovlpfraction;
00102
00103 };
00104
00111 class rangePair : public alnrange {
00112 public:
00113 rangePair() : alnrange(), tprtid(), tcov(0), tmodelid(0),
00114 tgenomicid(), tstrand(), tstart(-1), tend(-1) {}
00115 rangePair(const rangePair& r);
00124 rangePair (int b, int e, double s, double ng,
00125 double c, const string &tpi, double tc,
00126 int tmi, const string &tgi, char tst,
00127 int ts, int te)
00128 : alnrange(b,e,s,ng,c), tprtid(tpi), tcov(tc),
00129 tmodelid(tmi), tgenomicid(tgi), tstrand(tst),
00130 tstart(ts), tend(te) {}
00131 double getTcov() const { return tcov; }
00132 string getTprtid() const { return tprtid; }
00139 string asTabedString() const;
00140 string asDelimitedString(char sep[]=",") const;
00141 string genomicInfo(char sep[]="\t") const {
00142 return tgenomicid + sep + tstrand; }
00143 string getGenomic() const { return tgenomicid; }
00144 char getStrand() const { return tstrand; }
00145 static string fields();
00146
00150 string essentialInfo() const;
00151
00152 ~rangePair() {}
00153
00154 bool sameGene(const rangePair &r) const;
00161
00162
00163
00164
00165 static void setIntronLimit(int length) { distance_cut=length; }
00166
00167 private:
00168
00169 string tprtid;
00170 double tcov;
00171 int tmodelid;
00172 string tgenomicid;
00173 char tstrand;
00174 int tstart;
00175 int tend;
00176
00177 static float ngdiff_cut;
00178
00182 static int distance_cut;
00183 };
00184
00185 class SplitResult {
00186 private:
00187 string guide;
00188 int guideLen;
00189 list< pair<rangePair,rangePair> > joins;
00190
00191 public:
00192 SplitResult() {}
00193 void setGuide(const string &g, int len) { guide=g; guideLen=len; }
00194 void add(const rangePair *left, const rangePair *right) {
00195 joins.push_back(make_pair(*left, *right)); }
00196 bool empty() const { return joins.empty(); }
00197
00198 list<string> outputRow(char sep[]=",") const;
00199 };
00200
00201
00207 class avgrange {
00208 public:
00209
00210 avgrange()
00211 : n(0), sumscore(0), sumng(0), sumcov(0), sumbegin(0),
00212 sumend(0), begin(999999), end(0), covs(), sorted(false), members() { }
00213
00214
00215
00216
00217
00218
00219 avgrange(const alnrange &r);
00220 avgrange(const alnrange *rp);
00221 ~avgrange();
00222 bool overlap(const alnrange &r, const int margin=10);
00223
00224
00225
00226
00227 void merge(const alnrange *r);
00228
00229
00230 void merge(const avgrange *ar);
00231
00232 double length() const { return (sumend-sumbegin+n)/static_cast<double>(n); }
00233 double getBegin() const { return sumbegin/static_cast<double>(n); }
00234 double getEnd() const { return sumend/static_cast<double>(n); }
00235 double getScore() const { return sumscore/sumcov; }
00236 double getNg() const { return sumng/sumcov; }
00237 double getCov() const { return sumcov/n; }
00238 int maxlength() const { return end-begin+1; }
00239 int minbegin() const { return begin; }
00240 int maxend() const { return end; }
00241 int getCount() const { return members.size(); }
00242 const vector<const alnrange* > & getMembers() const { return members; }
00243
00244 friend ostream& operator<<(ostream &ous, const avgrange &ar);
00245
00246
00247
00248
00249 ostream& writeTable(ostream &ous) const;
00253 string asDelimitedString(const char sep[]=",") const;
00254
00255
00256
00257 ostream& sqlinfo(ostream &ous);
00258
00259
00260 double getMedianCov() const;
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270 string checkSplit_debug(const avgrange &r) const;
00271 list<string> checkSplit(const avgrange &r, char sep[]=",") const;
00272 SplitResult testSplit(const avgrange &r, char sep[]=",") const;
00273
00274
00275 static string colheaders() {
00276 return "min_begin\tmax_end\tavg_begin\tavg_end\tn\tavg_score\tavg_ngidentity\tavg_coverage\tmedian_coverage";
00277 }
00278
00279 private:
00280 int begin, end;
00281 int sumbegin, sumend;
00282 double sumscore, sumng, sumcov;
00283
00284 int n;
00285
00286 mutable vector<double> covs;
00287
00288
00289
00290
00291 mutable bool sorted;
00292
00293
00294
00295
00296
00300 vector<const alnrange*> members;
00301 };
00302
00319
00329 #endif