annotate spp/src/peaks.cpp @ 15:e689b83b0257 draft

Uploaded
author zzhou
date Tue, 27 Nov 2012 16:15:21 -0500
parents ce08b0efa3fd
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
1 #include <vector>
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
2 #include <string.h>
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
3 #include <iostream>
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
4 #include <string>
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
5 #include <set>
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
6
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
7 extern "C" {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
8 #include "R.h"
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
9 #include "Rmath.h"
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
10 #include "Rinternals.h"
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
11 #include "Rdefines.h"
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
12 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
13
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
14 using namespace std;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
15 using namespace __gnu_cxx;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
16
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
17 /**
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
18 * Calculate all local peaks
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
19 */
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
20
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
21 //#define DEBUG 1
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
22
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
23 extern "C" {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
24 SEXP find_peaks(SEXP x_R,SEXP thr_R,SEXP max_span_R) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
25
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
26 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
27 Rprintf("start\n");
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
28 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
29 double* x=REAL(x_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
30 int nx=LENGTH(x_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
31 int max_span=*INTEGER(max_span_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
32 double thr=REAL(thr_R)[0];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
33 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
34 Rprintf("n=%d; thr=%f; max_span=%d\n",nx,thr,max_span);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
35 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
36
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
37 vector<int> pos;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
38
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
39 double pv=x[0];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
40 double ppv=0; // previous peak value
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
41 int ppp=-max_span-1; // previous peak position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
42
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
43 for(int i=1;i<(nx-1);i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
44 if(x[i]>pv && x[i]>=thr && x[i]>x[i+1]) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
45 if(max_span>2) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
46 //Rprintf("i=%d; ppp=%d\n",i,ppp);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
47 if(i-ppp > max_span) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
48 if(ppp>=0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
49 pos.push_back(ppp);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
50 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
51 //Rprintf("recorded %d; now %d\n",ppp,i);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
52 ppp=i; ppv=x[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
53 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
54 if(x[i]>ppv) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
55 //Rprintf("reset from %d to %d\n",ppp,i);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
56 ppp=i; ppv=x[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
57 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
58 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
59 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
60 pos.push_back(i);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
61 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
62 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
63 if(x[i]!=x[i+1]) { pv=x[i]; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
64 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
65
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
66 // add remaining peak
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
67 if(max_span>2 && ppp>=0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
68 pos.push_back(ppp);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
69 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
70
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
71 SEXP nv;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
72 PROTECT(nv=allocVector(INTSXP,pos.size()));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
73 int* i_nv=INTEGER(nv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
74 int i=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
75 for(vector<int> ::const_iterator pi=pos.begin();pi!=pos.end();++pi) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
76 i_nv[i++]=1+(*pi);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
77 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
78
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
79 UNPROTECT(1);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
80 return(nv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
81 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
82
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
83
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
84
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
85
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
86 /************************************************************************/
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
87 // given a data vector d (positive values) and a set of signed center coordinates pos,
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
88 // returns coordinates of data points relative to the centers
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
89 // size is the size of the region around the centers
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
90 // return: vector of relative coordinates (x) and indecies of centers relative the coordinate
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
91 // was calculated (i).
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
92 SEXP get_relative_coordinates(SEXP d_R,
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
93 SEXP pos_R,
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
94 SEXP size_R)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
95 {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
96 int *d, *pos;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
97 int npos,nd,size;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
98
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
99 d = INTEGER(d_R); pos = INTEGER(pos_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
100 npos=LENGTH(pos_R); nd=LENGTH(d_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
101 size = INTEGER(size_R)[0];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
102 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
103 Rprintf("|d|=%d, |c|=%d, size=%d\n",nd,npos,size);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
104 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
105
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
106 vector<int> x; vector<int> xi;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
107 int k=0; // current pos index
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
108
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
109 for(int i=0;i<nd;i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
110 // increment k until pos[k]+size>=d[i]
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
111 while((abs(pos[k])+size) < d[i]) { k++; if(k==npos) { break; };
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
112 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
113 Rprintf("advancing k to %d\n",k);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
114 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
115 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
116 if(k==npos) { break; };
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
117 // increment i until d[i]>=pos[k]-size
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
118 while((abs(pos[k])-size) > d[i]) { i++; if(i==nd) { break; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
119 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
120 Rprintf("advancing i to %d\n",i);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
121 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
122 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
123 if(i==nd) { break; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
124
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
125
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
126 int l=k;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
127 while((l<npos) && ((abs(pos[l])-size) <= d[i])) { l++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
128 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
129 Rprintf("advancing l to %d\n",l);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
130 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
131 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
132 for(int j=k;j<l;j++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
133 int pd=d[i]-abs(pos[j]);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
134 if(abs(pd)<=size) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
135 // record
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
136 if(pos[j]>0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
137 x.push_back(pd);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
138 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
139 x.push_back(-1*pd);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
140 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
141 xi.push_back(j);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
142 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
143 Rprintf("recorded i=%d, j=%d\n",i,j);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
144 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
145 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
146 break;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
147 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
148 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
149 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
150
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
151 SEXP xv_R,xiv_R;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
152 PROTECT(xv_R=allocVector(INTSXP,x.size()));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
153 PROTECT(xiv_R=allocVector(INTSXP,x.size()));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
154 int* xv=INTEGER(xv_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
155 int* xiv=INTEGER(xiv_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
156
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
157 int i=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
158 for(vector<int> ::const_iterator pi=x.begin();pi!=x.end();++pi) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
159 xv[i++]=*pi;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
160 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
161 i=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
162 for(vector<int> ::const_iterator pi=xi.begin();pi!=xi.end();++pi) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
163 xiv[i++]=1+(*pi);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
164 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
165
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
166 SEXP ans_R, names_R;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
167 PROTECT(names_R = allocVector(STRSXP, 2));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
168 SET_STRING_ELT(names_R, 0, mkChar("x"));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
169 SET_STRING_ELT(names_R, 1, mkChar("i"));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
170
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
171 PROTECT(ans_R = allocVector(VECSXP, 2));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
172 SET_VECTOR_ELT(ans_R, 0, xv_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
173 SET_VECTOR_ELT(ans_R, 1, xiv_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
174 setAttrib(ans_R, R_NamesSymbol, names_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
175
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
176 UNPROTECT(4);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
177 return(ans_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
178 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
179
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
180
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
181 // determines a set of points within a set of fragments
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
182 // note: all vectors sorted in ascending order
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
183 // note: all vectors are integers
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
184 // x_R - vector of point positions
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
185 // se_R - vector of start and end positions
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
186 // fi_R - vector of signed fragment indecies
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
187 // return_list_R - whether a list of fragments should be returned for each point
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
188 // return_unique_R - whether points in multiple fragments should be omitted
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
189 SEXP points_within(SEXP x_R,SEXP se_R,SEXP fi_R,SEXP return_list_R,SEXP return_unique_R,SEXP return_point_counts_R) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
190 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
191 Rprintf("start\n");
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
192 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
193 int* x=INTEGER(x_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
194 int nx=LENGTH(x_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
195 int* se=INTEGER(se_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
196 int* fi=INTEGER(fi_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
197 int nf=LENGTH(se_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
198
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
199 int return_list=*(INTEGER(return_list_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
200 int return_unique=*(INTEGER(return_unique_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
201 int return_point_counts=*(INTEGER(return_point_counts_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
202
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
203 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
204 Rprintf("nf=%d; nx=%d, return_list=%d, return_unique=%d, return_point_counts=%d\n",nf/2,nx,return_list,return_unique,return_point_counts);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
205 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
206 set<int> fset;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
207
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
208
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
209 SEXP nv; int *i_nv;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
210 int np=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
211 if(return_point_counts) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
212 PROTECT(nv = allocVector(INTSXP, nf/2)); np++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
213 i_nv=INTEGER(nv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
214 for(int i=0;i<nf/2;i++) { i_nv[i]=0; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
215 } else if(return_list) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
216 PROTECT(nv = allocVector(VECSXP, nx)); np++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
217 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
218 PROTECT(nv=allocVector(INTSXP,nx)); np++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
219 i_nv=INTEGER(nv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
220 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
221
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
222 int j=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
223
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
224 for(int i=0;i<nx;i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
225 // advance j
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
226 while(j<nf && se[j]<x[i]) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
227 int frag=fi[j];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
228 if(frag>0) { // insert
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
229 fset.insert(frag);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
230 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
231 Rprintf("inserted frag %d, size=%d\n",frag,fset.size());
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
232 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
233 } else { // remove
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
234 fset.erase(-frag);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
235 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
236 Rprintf("removed frag %d, size=%d\n",-frag,fset.size());
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
237 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
238 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
239 j++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
240 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
241 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
242 Rprintf("i=%d j=%d\n",i,j);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
243 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
244 if(return_list) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
245 if(fset.empty() || (return_unique && fset.size()>1)) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
246 // assign null list?
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
247 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
248 SEXP fil_R;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
249 PROTECT(fil_R=allocVector(INTSXP,fset.size())); np++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
250 int* fil=INTEGER(fil_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
251 int k=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
252 for(set<int>::const_iterator ki=fset.begin();ki!=fset.end();++ki) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
253 fil[k]=*ki; k++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
254 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
255 SET_VECTOR_ELT(nv, i, fil_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
256 UNPROTECT(1); np--;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
257 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
258 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
259 if(return_point_counts) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
260 for(set<int>::const_iterator ki=fset.begin();ki!=fset.end();++ki) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
261 i_nv[*ki-1]++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
262 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
263 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
264 if(fset.empty() || (return_unique && fset.size()>1)) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
265 i_nv[i]=-1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
266 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
267 i_nv[i]=*fset.begin();
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
268 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
269 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
270 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
271 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
272
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
273 UNPROTECT(np);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
274 return(nv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
275 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
276
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
277
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
278 SEXP expuni_lr(SEXP x_R, // positions and their number (assumed sorted in ascending order)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
279 SEXP mdist_R, // max distance at which points should be considered
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
280 SEXP lambda_R, // lambda value
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
281 SEXP spos_R, // starting position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
282 SEXP epos_R, // ending position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
283 SEXP step_R, // step size
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
284 SEXP return_peaks_R, // whether peak positions should be returned, or entire score vector
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
285 SEXP min_peak_lr_R // min peak height (lr)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
286 )
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
287 {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
288
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
289 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
290 Rprintf("start\n");
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
291 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
292 int* x=INTEGER(x_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
293 int nx=LENGTH(x_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
294 int mdist=INTEGER(mdist_R)[0];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
295 double lambda=*(REAL(lambda_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
296
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
297 int return_peaks=*(INTEGER(return_peaks_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
298 double min_peak=*(REAL(min_peak_lr_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
299
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
300 int spos=*(INTEGER(spos_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
301 int epos=*(INTEGER(epos_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
302 int step=*(INTEGER(step_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
303
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
304 int nsteps=(int) (epos-spos)/step;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
305
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
306
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
307 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
308 Rprintf("n=%d; lambda=%f; mdist=%d; spos=%d; epos=%d; step=%d; nsteps=%d\n",nx,lambda,mdist,spos,epos,step,nsteps);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
309 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
310
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
311
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
312 SEXP nv;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
313 double *d_nv;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
314 if(!return_peaks) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
315 PROTECT(nv=allocVector(REALSXP,nsteps+1));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
316 d_nv=REAL(nv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
317 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
318
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
319
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
320 int i=0; // current index of the first point being used in the calculations
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
321 int j=0; // current index of the last point being used in the calculations
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
322 int sx=0; // current sum of all positions
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
323 int n=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
324
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
325 for(int k=0; k<=nsteps; k++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
326 int cpos=spos+k*step;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
327 // increase i until x[i]>=cpos-mdist; remove x from sx; decrement n;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
328 while(i<nx && x[i]<(cpos-mdist)) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
329 n--; sx-=x[i]; i++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
330 //Rprintf("incremented i: i=%d; n=%d; sx=%d; cpos-mdist=%d; x[i-1]=%d\n",i,n,sx,cpos-mdist,x[i-1]);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
331 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
332 //Rprintf("stable i: i=%d; n=%d; sx=%d; cpos-mdist=%d; x[i-1]=%d\n",i,n,sx,cpos-mdist,x[i-1]);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
333
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
334 //if(i>j) { j=i; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
335
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
336 // increase j until x[j]>cpos
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
337 while(j<nx && x[j]<=cpos) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
338 n++; sx+=x[j]; j++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
339 //Rprintf("incremented j: j=%d; n=%d; sx=%d; cpos=%d; x[j-1]=%d\n",j,n,sx,cpos,x[j-1]);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
340 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
341 //Rprintf("stable j: j=%d; n=%d; sx=%d; cpos=%d; x[j-1]=%d\n",j,n,sx,cpos,x[j]);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
342
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
343 // calculate lr
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
344 d_nv[k]=((double)(1-n))*log(lambda)-lambda*((double)(n*(cpos+1)-sx));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
345 //Rprintf("recorded lr[%d]=%f\n",k-1,d_nv[k-1]);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
346 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
347 UNPROTECT(1);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
348 return(nv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
349 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
350
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
351
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
352 SEXP allpdist(SEXP x_R,SEXP max_dist_R) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
353
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
354 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
355 Rprintf("start\n");
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
356 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
357 double* x=REAL(x_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
358 int nx=LENGTH(x_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
359 double max_dist=*REAL(max_dist_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
360 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
361 Rprintf("n=%d; max_dist=%d\n",nx,max_dist);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
362 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
363
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
364 vector<double> dist;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
365
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
366 for(int i=0;i<nx;i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
367 for(int j=i+1;j<nx;j++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
368
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
369 double d=x[j]-x[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
370 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
371 Rprintf("i=%d; j=%d; d=%f\n",i,j,d);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
372 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
373 if(d<=max_dist) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
374 dist.push_back(d);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
375 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
376 break;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
377 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
378 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
379 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
380
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
381 SEXP nv;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
382 PROTECT(nv=allocVector(REALSXP,dist.size()));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
383 double* i_nv=REAL(nv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
384 int i=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
385 for(vector<double> ::const_iterator pi=dist.begin();pi!=dist.end();++pi) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
386 i_nv[i++]=*pi;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
387 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
388
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
389 UNPROTECT(1);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
390 return(nv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
391 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
392
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
393 // same as above, but for two different sets
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
394 SEXP allxpdist(SEXP x_R,SEXP y_R, SEXP max_dist_R) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
395
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
396 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
397 Rprintf("start\n");
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
398 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
399 double* x=REAL(x_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
400 double* y=REAL(y_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
401 int nx=LENGTH(x_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
402 int ny=LENGTH(y_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
403 double max_dist=*REAL(max_dist_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
404 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
405 Rprintf("nx=%d; ny=%d; max_dist=%d\n",nx,ny,max_dist);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
406 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
407
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
408 vector<double> dist;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
409 int yi=0; // latest y start index
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
410
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
411 for(int i=0;i<nx;i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
412 // adjust yi so that yi>=x[i]-max_dist_R
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
413 while(y[yi]<(x[i]-max_dist) && yi<ny) { yi++; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
414 if(yi==ny) { break; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
415
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
416 for(int j=yi;j<ny;j++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
417 double d=y[j]-x[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
418 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
419 Rprintf("i=%d; j=%d; d=%f\n",i,j,d);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
420 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
421 if(d<=max_dist) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
422 dist.push_back(d);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
423 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
424 break;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
425 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
426 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
427 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
428
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
429 SEXP nv;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
430 PROTECT(nv=allocVector(REALSXP,dist.size()));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
431 double* i_nv=REAL(nv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
432 int i=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
433 for(vector<double> ::const_iterator pi=dist.begin();pi!=dist.end();++pi) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
434 i_nv[i++]=*pi;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
435 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
436
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
437 UNPROTECT(1);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
438 return(nv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
439 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
440
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
441 // returns a vector giving for each point,
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
442 // number of points within a given max_dist
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
443 SEXP nwithindist(SEXP x_R,SEXP max_dist_R) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
444
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
445 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
446 Rprintf("start\n");
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
447 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
448 double* x=REAL(x_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
449 int nx=LENGTH(x_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
450 double max_dist=*REAL(max_dist_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
451
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
452 SEXP nv;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
453 PROTECT(nv=allocVector(REALSXP,nx));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
454 double* i_nv=REAL(nv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
455 for(int i=0;i<nx;i++) { i_nv[i]=0; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
456
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
457 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
458 Rprintf("n=%d; max_dist=%d\n",nx,max_dist);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
459 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
460
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
461 for(int i=0;i<nx;i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
462 for(int j=i+1;j<nx;j++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
463
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
464 double d=x[j]-x[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
465 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
466 Rprintf("i=%d; j=%d; d=%f\n",i,j,d);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
467 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
468 if(d<=max_dist) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
469 i_nv[i]++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
470 i_nv[j]++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
471 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
472 break;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
473 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
474 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
475 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
476
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
477 UNPROTECT(1);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
478 return(nv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
479 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
480
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
481
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
482
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
483
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
484 // given a list of sorted chromosome signal and background vectors (unscaled), determine
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
485 // cluster contigs exceeding thr poisson P value, based on a whs window size,
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
486 // and satisfying mcs cluster size
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
487 SEXP find_poisson_enrichment_clusters(SEXP pos_R,SEXP flag_R,SEXP wsize_R,SEXP thr_R,SEXP mcs_R,SEXP bgm_R,SEXP mintag_R,SEXP either_R) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
488
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
489 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
490 Rprintf("start\n");
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
491 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
492 double* pos=REAL(pos_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
493 int* flag=INTEGER(flag_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
494 int nt=LENGTH(pos_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
495
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
496 int mcs=*INTEGER(mcs_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
497 int wsize=*INTEGER(wsize_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
498 int either=*INTEGER(either_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
499 double thr=REAL(thr_R)[0];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
500 double bgm=REAL(bgm_R)[0];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
501 double mintag=REAL(mintag_R)[0];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
502
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
503 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
504 Rprintf("nt=%d; wsize=%d; thr=%f; mcs=%d; min.tag=%f; bgm=%f\n",nt,wsize,thr,mcs,mintag,bgm);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
505 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
506
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
507
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
508 vector< pair<double,double> > contigs;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
509
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
510 // running indecies (start and end)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
511 int si=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
512 int ei=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
513
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
514 // current window coordinate
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
515 double ws=pos[0];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
516
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
517 // current window tag counts
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
518 int cc[2]={0,0};
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
519
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
520
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
521 if(nt>0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
522 cc[flag[si]]++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
523 // increment window end
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
524 while(ei<(nt-1) && (pos[ei+1]-ws) <= wsize) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
525 ei++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
526 cc[flag[ei]]++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
527 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
528
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
529
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
530 // cluster start,end positions
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
531 double cs,ce;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
532 int inclust=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
533
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
534 while(si<nt-1) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
535
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
536 if((pos[si+1]-ws) > (pos[ei+1] - ws - wsize) && ei!=(nt-1)) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
537 // move end boudnary
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
538 ei++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
539 ws=pos[ei]-wsize;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
540 cc[flag[ei]]++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
541 while(ei<(nt-1) && pos[ei+1]==ws+wsize) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
542 ei++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
543 cc[flag[ei]]++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
544 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
545
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
546 // increment window start
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
547 while(si<(nt-1) && pos[si] < ws) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
548 cc[flag[si]]--;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
549 si++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
550 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
551
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
552 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
553 // move up start boundary
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
554 ws=pos[si+1];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
555 cc[flag[si]]--;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
556 si++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
557 while(si<(nt-1) && pos[si+1]==ws) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
558 cc[flag[si]]--;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
559 si++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
560 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
561
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
562 // increment window end
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
563 while(ei<(nt-1) && (pos[ei+1] - ws) <= wsize) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
564 ei++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
565 cc[flag[ei]]++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
566 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
567
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
568 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
569
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
570 // calculate z score
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
571 double dc0=((double)cc[0])+0.5;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
572 double dc1=((double)cc[1])+0.5;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
573 double rte=dc0+dc1-0.25*thr*thr;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
574 double lb;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
575 if(rte<=0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
576 lb=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
577 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
578 lb=(sqrt(dc1*dc0) - 0.5*thr*sqrt(rte))/(dc0 - 0.25*thr*thr);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
579 if(lb<0) { lb=0; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
580 lb*=lb;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
581 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
582
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
583 //Rprintf("%f=f(%f,%f,%f); %f=f(%f,%f,%f)\n",lb,1.0-thr,2.0*dc1,2.0*dc0,ub,thr,2.0*dc1,2.0*dc0);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
584
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
585 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
586 //double ub=gsl_cdf_fdist_Qinv(thr,2.0*dc1,2.0*dc0)*dc1/dc0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
587 double ub=(sqrt(dc1*dc0) + 0.5*thr*sqrt(rte))/(dc0 - 0.25*thr*thr);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
588 ub*=ub;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
589 Rprintf("s=%d (%f); e=%d (%f); window: %f-%f; cc=[%d,%d]; lb=%f; ub=%f\n",si,pos[si],ei,pos[ei],ws,ws+wsize,cc[0],cc[1],lb,ub);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
590 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
591
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
592 int bc=lb>=bgm && cc[1]>=mintag;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
593 if(either) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
594 bc=lb>=bgm || cc[1]>=mintag;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
595 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
596 if(bc) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
597 if(inclust) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
598 double nce=ws+wsize/2.0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
599 if(nce-ce > wsize/2.0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
600 // next point is too far removed, end cluster
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
601 if(ce-cs >= mcs) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
602 contigs.push_back(pair<double,double>(cs,ce));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
603 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
604 Rprintf("recorded cluster %f-%f\n",cs,ce);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
605 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
606 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
607 inclust=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
608 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
609 ce=nce;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
610 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
611 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
612 inclust=1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
613 cs=ws+wsize/2.0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
614 ce=cs;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
615 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
616 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
617 if(inclust) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
618 if(ce-cs >= mcs) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
619 contigs.push_back(pair<double,double>(cs,ce));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
620 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
621 Rprintf("recorded cluster %f-%f\n",cs,ce);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
622 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
623 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
624 inclust=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
625 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
626 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
627
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
628 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
629
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
630 if(inclust) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
631 if(ce-cs >= mcs) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
632 contigs.push_back(pair<double,double>(cs,ce));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
633 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
634 Rprintf("recorded cluster %f-%f\n",cs,ce);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
635 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
636 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
637 inclust=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
638 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
639 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
640
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
641 SEXP cs_R,ce_R;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
642 PROTECT(cs_R=allocVector(REALSXP,contigs.size()));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
643 PROTECT(ce_R=allocVector(REALSXP,contigs.size()));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
644 double* csa=REAL(cs_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
645 double* cea=REAL(ce_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
646
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
647 int i=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
648 for(vector< pair<double,double> >::const_iterator ci=contigs.begin(); ci!=contigs.end();++ci) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
649 csa[i]=ci->first;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
650 cea[i]=ci->second;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
651 i++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
652 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
653
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
654 SEXP ans_R, names_R;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
655 PROTECT(names_R = allocVector(STRSXP, 2));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
656 SET_STRING_ELT(names_R, 0, mkChar("s"));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
657 SET_STRING_ELT(names_R, 1, mkChar("e"));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
658
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
659 PROTECT(ans_R = allocVector(VECSXP, 2));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
660 SET_VECTOR_ELT(ans_R, 0, cs_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
661 SET_VECTOR_ELT(ans_R, 1, ce_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
662 setAttrib(ans_R, R_NamesSymbol, names_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
663
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
664 UNPROTECT(4);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
665 return(ans_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
666
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
667 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
668
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
669
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
670 // finds intersection between a list of regions
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
671 // the flag has +n/-n value, corresponding to the start/end of a segment in n-th regionset
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
672 // max_val: 1 - report max overlapping value, -1: report min, 0 - don't look at values
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
673 // returns: $s, $e, ($v) lists
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
674 SEXP region_intersection(SEXP n_R,SEXP pos_R,SEXP flags_R,SEXP vals_R,SEXP max_val_R,SEXP union_R) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
675 const int max_val=*INTEGER(max_val_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
676 const int unionr=*INTEGER(union_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
677 const int n=*INTEGER(n_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
678 double* pos=REAL(pos_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
679 int* flags=INTEGER(flags_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
680 double* val=REAL(vals_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
681
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
682 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
683 Rprintf("n=%d; npos=%d; max_val=%d\n",n,LENGTH(pos_R),max_val);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
684 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
685
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
686 int s[n]; // flag status for each set
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
687 double mv[n]; // max/min value of current clusters
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
688
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
689 for(int i=0;i<n;i++) { s[i]=0; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
690
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
691 vector<double> starts;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
692 vector<double> ends;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
693 vector<double> values;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
694
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
695 int start=-1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
696 double mval=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
697 for(int i=0;i<LENGTH(pos_R);i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
698 // update flags
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
699 int f=flags[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
700 if(f>0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
701 s[abs(f)-1]++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
702 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
703 s[abs(f)-1]--;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
704 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
705
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
706 if(max_val!=0 && val[i]*max_val > mval*max_val) { mval=val[i]; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
707
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
708 // joined status
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
709 int all;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
710 if(unionr) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
711 all=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
712 for(int j=0;j<n;j++) { if(s[j]>0) { all=1; break;} }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
713 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
714 all=1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
715 for(int j=0;j<n;j++) { all=all & (s[j]>0); }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
716 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
717
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
718
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
719 //Rprintf("i=%d; s=[",i);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
720 //for(int j=0;j<n;j++) { Rprintf("%d",s[j]); }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
721 //Rprintf("]; all=%d; start=%d\n",all,start);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
722
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
723 if(start>=0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
724 // in fragment
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
725 if(!all) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
726 // end fragment
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
727 starts.push_back(pos[start]);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
728 ends.push_back(pos[i]);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
729 start=-1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
730 if(max_val!=0) { values.push_back(mval); }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
731
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
732 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
733 Rprintf("recorded new fragment (s=%f,e=%f,v=%f);\n",pos[start],pos[i],mval);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
734 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
735 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
736 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
737 // should a fragment be started?
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
738 if(all) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
739 start=i;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
740 if(max_val!=0) { mval=val[i]; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
741 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
742 Rprintf("starting new fragment (s=%f,i=%d);\n",pos[start],i);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
743 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
744 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
745 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
746 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
747 SEXP cs_R,ce_R,cv_R;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
748 PROTECT(cs_R=allocVector(REALSXP,starts.size()));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
749 PROTECT(ce_R=allocVector(REALSXP,ends.size()));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
750
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
751 double* csa=REAL(cs_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
752 int i=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
753 for(vector<double>::const_iterator ci=starts.begin(); ci!=starts.end(); ++ci) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
754 csa[i]=*ci; i++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
755 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
756
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
757 csa=REAL(ce_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
758 i=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
759 for(vector<double>::const_iterator ci=ends.begin(); ci!=ends.end(); ++ci) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
760 csa[i]=*ci; i++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
761 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
762
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
763 if(max_val!=0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
764 PROTECT(cv_R=allocVector(REALSXP,values.size()));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
765 csa=REAL(cv_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
766 i=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
767 for(vector<double>::const_iterator ci=values.begin(); ci!=values.end(); ++ci) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
768 csa[i]=*ci; i++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
769 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
770 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
771
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
772 SEXP ans_R, names_R;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
773 if(max_val!=0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
774 PROTECT(names_R = allocVector(STRSXP, 3));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
775 SET_STRING_ELT(names_R, 0, mkChar("s"));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
776 SET_STRING_ELT(names_R, 1, mkChar("e"));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
777 SET_STRING_ELT(names_R, 2, mkChar("v"));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
778
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
779 PROTECT(ans_R = allocVector(VECSXP, 3));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
780 SET_VECTOR_ELT(ans_R, 0, cs_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
781 SET_VECTOR_ELT(ans_R, 1, ce_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
782 SET_VECTOR_ELT(ans_R, 2, cv_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
783 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
784 PROTECT(names_R = allocVector(STRSXP, 2));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
785 SET_STRING_ELT(names_R, 0, mkChar("s"));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
786 SET_STRING_ELT(names_R, 1, mkChar("e"));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
787
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
788 PROTECT(ans_R = allocVector(VECSXP, 2));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
789 SET_VECTOR_ELT(ans_R, 0, cs_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
790 SET_VECTOR_ELT(ans_R, 1, ce_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
791 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
792
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
793 setAttrib(ans_R, R_NamesSymbol, names_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
794
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
795 if(max_val!=0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
796 UNPROTECT(5);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
797 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
798 UNPROTECT(4);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
799 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
800 return(ans_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
801 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
802
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
803 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
804