annotate spp/src/wdl.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 //#define DEBUG 1
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
18
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
19 extern "C" {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
20
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
21 /************************************************************************/
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
22 /*
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
23 * lwcc - calculate local window cross-correlation
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
24 */
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
25
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
26 SEXP lwcc(SEXP x_R, // positive strand hist
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
27 SEXP y_R, // negative strand hist of the same length
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
28 SEXP osize_R, // outer boundary distance
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
29 SEXP isize_R, // inner boundary distance
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
30 SEXP return_peaks_R, // whether all correlation values, or just peaks should be returned
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
31 SEXP min_peak_dist_R, // distance between closest peaks
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
32 SEXP min_peak_val_R, // min peak threshold
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
33 SEXP tag_weight_R, // tag weight
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
34 SEXP bg_subtract_R, // a flag whether do background subtractio
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
35 SEXP bgp_R, // optional background hist for positive strand
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
36 SEXP bgn_R, // optional background hist for negative strand
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
37 SEXP bg_wsize_R, // window size for the background counts
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
38 SEXP bg_weight_R, // optional weighting for the background tags, must compensate for window size difference (including is cutout)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
39 SEXP round_up_R // whether to round up fractional signal tag counts
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
40 )
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
41 {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
42
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
43 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
44 Rprintf("start\n");
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
45 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
46
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
47 int is=INTEGER(isize_R)[0];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
48 int os=INTEGER(osize_R)[0];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
49 double rs=((double)(2*os+1));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
50 int* x=INTEGER(x_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
51 int* y=INTEGER(y_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
52 int n_x=LENGTH(x_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
53
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
54 // background-related
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
55 int* bgp=INTEGER(bgp_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
56 int* bgn=INTEGER(bgn_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
57 int bg_whs=INTEGER(bg_wsize_R)[0];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
58
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
59 int return_peaks=*(INTEGER(return_peaks_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
60 double min_peak_val=*(REAL(min_peak_val_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
61 int min_peak_dist=*(INTEGER(min_peak_dist_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
62 double tag_weight=*(REAL(tag_weight_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
63
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
64 const int round_up=*(INTEGER(round_up_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
65 const int bg_subtract=*(INTEGER(bg_subtract_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
66 const double bg_weight=*(REAL(bg_weight_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
67
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
68 int i; // point at which the value is being calculated
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
69 int start=os;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
70 int end=n_x-os-1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
71
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
72 // bg tag counts within bg window
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
73 int bg_pn1=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
74 int bg_nn1=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
75 int bg_pn2=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
76 int bg_nn2=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
77
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
78
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
79
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
80 // illustration for counting:
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
81 //
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
82 // 012345678901234567890123456789012
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
83 // ==========------|------==========
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
84 //
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
85 // osize=16; isize=6;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
86
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
87
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
88 SEXP nv;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
89 double *d_nv;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
90 vector<int> ppos;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
91 vector<double> pval;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
92 if(!return_peaks) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
93 PROTECT(nv=allocVector(REALSXP,n_x));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
94 d_nv=REAL(nv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
95 for(int i=0;i<n_x;i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
96 d_nv[i]=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
97 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
98 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
99
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
100 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
101 Rprintf("start=%d end=%d tag_weight=%f\n", start,end,tag_weight);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
102 Rprintf("x[1]=%d x[2]=%d y[1]=%d y[2]=%d\n",x[1],x[2],y[1],y[2]);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
103 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
104
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
105 int lpp=-1; // last peak position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
106 double lpv=-1e3; // last peak value
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
107
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
108 double ppv=-1e3; // last value
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
109 double pppv=-11e-3; // value before last
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
110
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
111 int pn1,pn2,nn1,nn2;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
112
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
113
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
114 if(bg_subtract) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
115 // pre-initialize background tag counts,
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
116 for(int i=0;i<bg_whs;i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
117 if(i<n_x) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
118 bg_pn2+=bgp[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
119 bg_nn2+=bgn[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
120 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
121 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
122 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
123
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
124
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
125 for(i=0;i<end;i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
126 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
127 //Rprintf("i=%d ", i);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
128 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
129
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
130 if(bg_subtract) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
131 // update background counts
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
132 int nl=i-bg_whs-1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
133
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
134 if(nl>=0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
135 bg_pn1-=bgp[nl];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
136 bg_nn1-=bgn[nl];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
137 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
138 bg_pn1+=bgp[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
139 bg_nn1+=bgn[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
140
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
141 if(i>0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
142 bg_pn2-=bgp[i-1];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
143 bg_nn2-=bgn[i-1];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
144 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
145 int nr=i+bg_whs;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
146 if(nr<n_x) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
147 bg_pn2+=bgp[nr];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
148 bg_nn2+=bgn[nr];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
149 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
150 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
151
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
152 if(i >= start) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
153 // update counts, taking into account masked out regions
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
154 pn1=pn2=nn1=nn2=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
155
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
156 for(int k=0;k<=(os-is);k++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
157 int xp1=x[i-os+k];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
158 int xp2=x[i+os-k];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
159 int xn1=y[i+os-k];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
160 int xn2=y[i-os+k];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
161
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
162 if(xp1!=-1 && xn1!=-1) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
163 pn1+=xp1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
164 nn1+=xn1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
165 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
166 if(xp2!=-1 && xn2!=-1) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
167 pn2+=xp2;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
168 nn2+=xn2;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
169 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
170 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
171
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
172 // calculate the means
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
173 double mp=((double)(pn1+pn2))/rs;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
174 double mn=((double)(pn1+pn2))/rs;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
175 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
176 Rprintf("mp=%f mn=%f\n",mp,mn);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
177 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
178 // calculate correlation
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
179 double varp=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
180 double varn=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
181 double num=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
182 double val=-1e3;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
183 if(mp>0 & mn>0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
184 for(int k=0;k<=(os-is);k++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
185 int xp1=x[i-os+k];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
186 int xp2=x[i+os-k];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
187 int xn1=y[i+os-k];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
188 int xn2=y[i-os+k];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
189
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
190
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
191 if(xp1!=-1 && xn1!=-1) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
192 double nnp1=((double) xp1)-mp;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
193 double nnn1=((double) xn1)-mn;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
194 num+=nnp1*nnn1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
195 varp+=nnp1*nnp1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
196 varn+=nnn1*nnn1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
197 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
198
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
199 if(xp2!=-1 && xn2!=-1) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
200 double nnp2=((double) xp2)-mp;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
201 double nnn2=((double) xn2)-mn;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
202 num+=nnp2*nnn2;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
203 varp+=nnp2*nnp2;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
204 varn+=nnn2*nnn2;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
205 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
206
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
207 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
208 double tagw;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
209 double spn1=((double)pn1)*tag_weight;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
210 double snn1=((double)nn1)*tag_weight;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
211 double spn2=((double)pn2)*tag_weight;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
212 double snn2=((double)nn2)*tag_weight;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
213 if(round_up) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
214 if(pn1>0 && spn1<1) { spn1=1.0; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
215 //if(pn2>0 && spn2<1) { spn2=1.0; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
216 if(nn1>0 && snn1<1) { snn1=1.0; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
217 //if(nn2>0 && snn2<1) { snn2=1.0; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
218 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
219
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
220 if(bg_subtract) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
221 spn1-=((double)bg_pn1)*bg_weight;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
222 snn1-=((double)bg_nn2)*bg_weight;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
223 spn2-=((double)bg_pn2)*bg_weight;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
224 snn2-=((double)bg_nn1)*bg_weight;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
225
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
226 if(spn2<0) spn2=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
227 if(snn2<0) snn2=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
228
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
229 if(spn1>0 && snn1>0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
230 tagw=(2.0*sqrt(spn1*snn1)-(spn2+snn2+1.0));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
231 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
232 tagw=-(spn2+snn2+1.0);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
233 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
234 //cout<<"bg_pn1="<<bg_pn1<<"; bg_pn2="<<bg_pn2<<"; bg_nn1="<<bg_nn1<<"; bg_nn2="<<bg_nn2<<endl;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
235 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
236 tagw=2.0*sqrt(spn1*snn1)-(spn2+snn2);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
237 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
238
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
239 if(tagw<0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
240 val=0.0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
241 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
242 if(num==0.0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
243 val=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
244 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
245 val=num/(sqrt(varp*varn));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
246 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
247 val=val*sqrt(tagw) + tagw;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
248
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
249 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
250 //cout<<"val="<<val<<endl;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
251
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
252 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
253 Rprintf("pn1=%d pn2=%d nn1=%d nn2=%d tag.weight=%f tagw=%f\n",pn1,pn2,nn1,nn2,tag_weight,tagw);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
254 Rprintf("tagw=%f varp=%f varn=%f num=%f cor=%f val=%f\n",tagw,varp,varn,num,num/sqrt(varp*varn),val);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
255 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
256 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
257
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
258
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
259
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
260 if(return_peaks) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
261 // determine if previous position was a peak
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
262 if(ppv>min_peak_val && ppv>val && ppv>pppv) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
263 if(lpp>0 && (i-lpp+1)>min_peak_dist) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
264 // record previous peak position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
265 ppos.push_back(lpp);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
266 pval.push_back(lpv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
267 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
268 Rprintf("recording peak x=%d y=%f d=%d\n",lpp,lpv,(i-lpp));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
269 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
270 lpp=i-1; lpv=ppv;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
271 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
272 Rprintf("updated peak to x=%d y=%f\n",lpp,lpv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
273 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
274 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
275 if(ppv>lpv) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
276 // update last peak positions
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
277 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
278 Rprintf("skipping peak x=%d y=%f d=%d in favor of x=%d y=%f\n",lpp,lpv,(i-lpp),i-1,ppv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
279 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
280 lpp=i-1; lpv=ppv;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
281 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
282 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
283 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
284
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
285 // update previous values
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
286 if(val!=ppv) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
287 pppv=ppv; ppv=val;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
288 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
289 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
290 d_nv[i]=val;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
291 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
292 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
293 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
294
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
295 if(return_peaks) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
296 // record last position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
297 if(lpp>0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
298 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
299 Rprintf("recording last peak x=%d y=%f\n",lpp,lpv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
300 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
301 ppos.push_back(lpp);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
302 pval.push_back(lpv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
303 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
304
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
305 SEXP rpp_R,rpv_R;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
306 PROTECT(rpp_R=allocVector(INTSXP,ppos.size()));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
307 PROTECT(rpv_R=allocVector(REALSXP,ppos.size()));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
308 int* rpp=INTEGER(rpp_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
309 double* rpv=REAL(rpv_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
310
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
311 for(int i=0;i<ppos.size();i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
312 rpp[i]=ppos[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
313 rpv[i]=pval[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
314 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
315
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
316 SEXP ans_R, names_R;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
317 PROTECT(names_R = allocVector(STRSXP, 2));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
318 SET_STRING_ELT(names_R, 0, mkChar("x"));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
319 SET_STRING_ELT(names_R, 1, mkChar("v"));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
320
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
321 PROTECT(ans_R = allocVector(VECSXP, 2));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
322 SET_VECTOR_ELT(ans_R, 0, rpp_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
323 SET_VECTOR_ELT(ans_R, 1, rpv_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
324 setAttrib(ans_R, R_NamesSymbol, names_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
325
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
326 UNPROTECT(4);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
327 return(ans_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
328 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
329 UNPROTECT(1);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
330 return(nv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
331 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
332
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
333 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
334
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
335
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
336
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
337 /************************************************************************/
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
338 /*
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
339 * wtd - window tag difference implementation
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
340 */
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
341
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
342 SEXP wtd(SEXP x_R, // positive strand hist
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
343 SEXP y_R, // negative strand hist of the same length
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
344 SEXP wsize_R, // outer boundary distance
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
345 SEXP return_peaks_R, // whether all correlation values, or just peaks should be returned
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
346 SEXP min_peak_dist_R, // distance between closest peaks
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
347 SEXP min_peak_val_R, // min peak threshold
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
348 SEXP direct_count_R, // whether tag weighting should not be done
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
349 SEXP tag_weight_R, // tag weight
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
350 SEXP ignore_masking_R, // whether to ignore masked regions
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
351 SEXP bg_subtract_R, // a flag whether do background subtractio
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
352 SEXP bgp_R, // optional background hist for positive strand
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
353 SEXP bgn_R, // optional background hist for negative strand
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
354 SEXP bg_wsize_R, // window size for the background counts
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
355 SEXP bg_weight_R, // optional weighting for the background tags, must compensate for window size difference
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
356 SEXP round_up_R // whether to round up fractional signal tag counts
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
357 )
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
358 {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
359
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
360 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
361 Rprintf("start\n");
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
362 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
363
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
364 int whs=INTEGER(wsize_R)[0];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
365 int* x=INTEGER(x_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
366 int* y=INTEGER(y_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
367 int n_x=LENGTH(x_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
368
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
369 // background-related
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
370 int* bgp=INTEGER(bgp_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
371 int* bgn=INTEGER(bgn_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
372 int bg_whs=INTEGER(bg_wsize_R)[0];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
373
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
374
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
375 const int return_peaks=*(INTEGER(return_peaks_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
376 const int direct_count=*(INTEGER(direct_count_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
377 const int ignore_masking=*(INTEGER(ignore_masking_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
378 const double min_peak_val=*(REAL(min_peak_val_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
379 const int min_peak_dist=*(INTEGER(min_peak_dist_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
380 const double tag_weight=*(REAL(tag_weight_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
381
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
382 const int round_up=*(INTEGER(round_up_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
383 const int bg_subtract=*(INTEGER(bg_subtract_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
384 const double bg_weight=*(REAL(bg_weight_R));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
385
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
386 int i; // point at which the value is being calculated
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
387 int start=whs+1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
388 int end=n_x-whs-1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
389
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
390 // tag counts to calculate the means
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
391 int pn1=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
392 int pn2=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
393 int nn1=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
394 int nn2=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
395
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
396 // bg tag counts within bg window
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
397 int bg_pn1=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
398 int bg_pn2=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
399 int bg_nn1=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
400 int bg_nn2=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
401
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
402 SEXP nv;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
403 double *d_nv;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
404 vector<int> ppos;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
405 vector<double> pval;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
406 if(!return_peaks) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
407 PROTECT(nv=allocVector(REALSXP,n_x));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
408 d_nv=REAL(nv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
409 for(int i=0;i<n_x;i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
410 d_nv[i]=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
411 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
412 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
413
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
414 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
415 Rprintf("whs=%d start=%d end=%d tag_weight=%f ignore_masing=%d\n", whs, start,end,tag_weight,ignore_masking);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
416 Rprintf("x[1]=%d x[2]=%d y[1]=%d y[2]=%d\n",x[1],x[2],y[1],y[2]);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
417 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
418
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
419 int lpp=-1; // last peak position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
420 double lpv=-1000; // last peak value
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
421
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
422 double ppv=-1000; // last value
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
423 int ppl=-1; // position of the last value
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
424 double pppv=-1000; // value before last
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
425
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
426
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
427 if(ignore_masking==1) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
428 for(int i=0;i<whs;i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
429 pn1+=x[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
430 pn2+=x[i+whs+1];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
431 nn1+=y[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
432 nn2+=y[i+whs+1];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
433
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
434 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
435 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
436
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
437 if(bg_subtract) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
438 // pre-initialize background tag counts,
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
439 for(int i=0;i<bg_whs;i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
440 if(i<n_x) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
441 bg_pn2+=bgp[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
442 bg_nn2+=bgn[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
443 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
444 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
445 // increment center of background count window to the start position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
446 for(int i=0;i<start;i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
447 // update background counts
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
448 int nl=i-bg_whs-1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
449
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
450 if(nl>=0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
451 bg_pn1-=bgp[nl];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
452 bg_nn1-=bgn[nl];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
453 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
454 bg_pn1+=bgp[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
455 bg_nn1+=bgn[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
456
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
457 if(i>0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
458 bg_pn2-=bgp[i-1];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
459 bg_nn2-=bgn[i-1];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
460 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
461 int nr=i+bg_whs;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
462 if(nr<n_x) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
463 bg_pn2+=bgp[nr];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
464 bg_nn2+=bgn[nr];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
465 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
466 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
467
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
468 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
469
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
470
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
471 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
472 Rprintf("initialization: i=%d pn1=%d, pn2=%d, nn1=%d, nn2=%d", i,pn1,pn2,nn1,nn2);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
473 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
474
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
475 for(i=start;i<end;i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
476 if(bg_subtract) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
477 // update background counts
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
478 int nl=i-bg_whs-1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
479
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
480 if(nl>=0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
481 bg_pn1-=bgp[nl];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
482 bg_nn1-=bgn[nl];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
483 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
484 bg_pn1+=bgp[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
485 bg_nn1+=bgn[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
486
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
487 if(i>0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
488 bg_pn2-=bgp[i-1];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
489 bg_nn2-=bgn[i-1];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
490 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
491 int nr=i+bg_whs;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
492 if(nr<n_x) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
493 bg_pn2+=bgp[nr];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
494 bg_nn2+=bgn[nr];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
495 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
496 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
497
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
498 // update counts
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
499 if(ignore_masking==1) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
500 pn1+=x[i-1]-x[i-whs-1];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
501 pn2+=x[i+whs]-x[i-1];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
502 nn1+=y[i-1]-y[i-whs-1];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
503 nn2+=y[i+whs]-y[i-1];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
504
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
505 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
506
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
507 pn1=pn2=nn1=nn2=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
508
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
509 for(int k=0;k<whs;k++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
510 int xp1=x[i-k-1];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
511 int xp2=x[i+k];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
512 int xn1=y[i-k-1];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
513 int xn2=y[i+k];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
514
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
515 // omit masked positions
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
516 if(xp1!=-1 && xn1!=-1 && xp2!=-1 && xn2!=-1) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
517 pn1+=xp1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
518 nn1+=xn1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
519 pn2+=xp2;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
520 nn2+=xn2;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
521 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
522 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
523 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
524
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
525 double val;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
526 double spn1=((double)pn1)*tag_weight;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
527 double snn1=((double)nn1)*tag_weight;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
528 double spn2=((double)pn2)*tag_weight;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
529 double snn2=((double)nn2)*tag_weight;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
530 if(round_up) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
531 if(pn1>0 && spn1<1) { spn1=1.0; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
532 //if(pn2>0 && spn2<1) { spn2=1.0; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
533 //if(nn1>0 && snn1<1) { snn1=1.0; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
534 if(nn2>0 && snn2<1) { snn2=1.0; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
535 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
536
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
537 if(direct_count) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
538 val=spn1+snn2;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
539 if(round_up && val<1) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
540 val=1.0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
541 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
542 if(bg_subtract) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
543 val-=((double) (bg_pn1+bg_nn2))*bg_weight;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
544 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
545 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
546 if(bg_subtract) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
547 spn1-=((double)bg_pn1)*bg_weight;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
548 snn1-=((double)bg_nn1)*bg_weight;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
549 spn2-=((double)bg_pn2)*bg_weight;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
550 snn2-=((double)bg_nn2)*bg_weight;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
551
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
552 if(spn2<0) spn2=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
553 if(snn1<0) snn1=0;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
554
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
555 if(spn1>0 && snn2>0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
556 val=(2.0*sqrt(spn1*snn2)-(spn2+snn1+1.0));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
557 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
558 val=-(spn2+snn1+1.0);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
559 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
560 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
561 val=2.0*sqrt(spn1*snn2)-(spn2+snn1+tag_weight);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
562 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
563 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
564 //double val=sqrt(pn1*nn2);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
565 //if(pn2>nn1) { val-=pn2; } else { val-=pn1; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
566 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
567 Rprintf("update: i=%d pn1=%d pn2=%d nn1=%d nn2=%d val=%f\n",i,pn1,pn2,nn1,nn2,val);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
568 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
569
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
570 if(return_peaks) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
571 // determine if previous position was a peak
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
572 if(ppv>min_peak_val && ppv>val && ppv>pppv) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
573 if(lpp>0 && (i-lpp+1)>min_peak_dist) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
574 // record previous peak position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
575 ppos.push_back(lpp);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
576 pval.push_back(lpv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
577 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
578 Rprintf("recording peak x=%d y=%f d=%d\n",lpp,lpv,(i-lpp));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
579 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
580 if(ppl!=-1 && ppl!=i-1) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
581 lpp=(int) round((ppl+i-1)/2);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
582 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
583 lpp=i-1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
584 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
585 lpv=ppv;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
586 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
587 Rprintf("updated peak to x=%d y=%f\n",lpp,lpv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
588 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
589 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
590 if(ppv>lpv) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
591 // update last peak positions
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
592 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
593 Rprintf("skipping peak x=%d y=%f d=%d in favor of x=%d y=%f\n",lpp,lpv,(i-lpp),i-1,ppv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
594 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
595 if(ppl!=-1 && ppl!=i-1) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
596 lpp=(int) round((ppl+i-1)/2);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
597 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
598 lpp=i-1;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
599 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
600 lpv=ppv;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
601 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
602 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
603 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
604
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
605 // update previous values
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
606 if(val!=ppv) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
607 pppv=ppv; ppv=val; ppl=i;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
608 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
609 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
610 d_nv[i]=val;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
611 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
612 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
613
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
614 if(return_peaks) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
615 // record last position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
616 if(lpp>0) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
617 #ifdef DEBUG
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
618 Rprintf("recording last peak x=%d y=%f\n",lpp,lpv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
619 #endif
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
620 ppos.push_back(lpp);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
621 pval.push_back(lpv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
622 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
623
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
624 SEXP rpp_R,rpv_R;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
625 PROTECT(rpp_R=allocVector(INTSXP,ppos.size()));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
626 PROTECT(rpv_R=allocVector(REALSXP,ppos.size()));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
627 int* rpp=INTEGER(rpp_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
628 double* rpv=REAL(rpv_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
629
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
630 for(int i=0;i<ppos.size();i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
631 rpp[i]=ppos[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
632 rpv[i]=pval[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
633 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
634
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
635 SEXP ans_R, names_R;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
636 PROTECT(names_R = allocVector(STRSXP, 2));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
637 SET_STRING_ELT(names_R, 0, mkChar("x"));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
638 SET_STRING_ELT(names_R, 1, mkChar("v"));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
639
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
640 PROTECT(ans_R = allocVector(VECSXP, 2));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
641 SET_VECTOR_ELT(ans_R, 0, rpp_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
642 SET_VECTOR_ELT(ans_R, 1, rpv_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
643 setAttrib(ans_R, R_NamesSymbol, names_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
644
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
645 UNPROTECT(4);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
646 return(ans_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
647 } else {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
648 UNPROTECT(1);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
649 return(nv);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
650 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
651
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
652 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
653
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
654
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
655 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
656
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
657