annotate spp/src/cdensum.c @ 6:ce08b0efa3fd draft

Uploaded
author zzhou
date Tue, 27 Nov 2012 16:11:40 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
1 #include <math.h>
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
2 #include "R.h"
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
3 #include "Rmath.h"
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
4 #include "Rinternals.h"
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
5
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
6
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
7 #undef DEBUG 1
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
8
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
9 // dout is npos-length output array.
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
10 // n - number of positions in pos (and length of tc count array)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
11 // spos - starting position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
12 void cdensum(int *n, double *pos, double *tc, double *spos, int *bw,int *dw, int *npos, int *step,double *dout)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
13 {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
14 int i,j;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
15
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
16 double epos= *spos + ((double) *npos);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
17 double dbw=(double) *bw;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
18 for(i = 0; i< *n; i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
19 // size of the window to which the contributions should be added
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
20 int in=(int) (pos[i]- *spos);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
21 int ic=tc[i];
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
22 int whs=(*dw)*(*bw)*ic;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
23 int ws=(int) floor((in-whs)/(*step));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
24 int we=(int) ceil((in+whs)/(*step));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
25 if(ws<0) { ws=0; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
26 if(we>= *npos) { we= *npos -1; }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
27
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
28 for(j=ws;j<we;j++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
29 double beta=((double)(j*(*step)-in))/dbw;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
30 dout[j]+=((double)ic)*exp(-0.5*beta*beta);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
31 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
32 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
33 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
34
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
35
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
36 // window tag counts
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
37 // dout is npos-length output array that will contain window tag counts
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
38 // windows are of a specified size, moved at a specified step
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
39 // n - number of positions in sorted tag array (positive only)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
40 // spos - starting position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
41 void window_n_tags(int *n, double *pos, double *spos, int *window_size, int *window_step, int *npos, int *dout)
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
42 {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
43 int i;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
44 int cs=0; int ce=0; // current array start/end indecies
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
45 int ctc=0; // current tag count
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
46 double wpos=*spos-(*window_size)/2; // left-edge position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
47 //Rprintf("n=%d; window_size=%d, window_step=%d, npos=%d, spos=%f\n",*n,*window_size,*window_step,*npos,*spos);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
48 for(i=0;i<*npos;i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
49 // advance end if needed
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
50 double ep=wpos+(*window_size);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
51 while(ce<(*n) && pos[ce]<=ep) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
52 ctc++; ce++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
53 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
54 // advance start
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
55 while(cs<*n && pos[cs]<wpos) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
56 ctc--; cs++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
57 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
58 dout[i]=ctc;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
59 // advance window position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
60 wpos+=*window_step;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
61 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
62 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
63
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
64 // window tag counts
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
65 // windows are of a specified size, moved at a specified step
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
66 // pos - tag positions (positive, pre-shifted)y
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
67 // spos - starting position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
68 // returns nsteps-length output array that will contain window tag counts
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
69 SEXP cwindow_n_tags(SEXP pos_R, SEXP spos_R, SEXP window_size_R, SEXP window_step_R, SEXP nsteps_R) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
70 double* pos=REAL(pos_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
71 int n=LENGTH(pos_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
72 int window_size=*INTEGER(window_size_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
73 int window_step=*INTEGER(window_step_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
74 int nsteps=*INTEGER(nsteps_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
75 double spos=*REAL(spos_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
76
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
77 // allocate return array
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
78 SEXP tc_R;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
79 PROTECT(tc_R=allocVector(INTSXP,nsteps));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
80 int* dout=INTEGER(tc_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
81
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
82 int i;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
83 int cs=0; int ce=0; // current array start/end indecies
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
84 int ctc=0; // current tag count
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
85 double wpos=spos-window_size/2; // left-edge position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
86 //Rprintf("n=%d; window_size=%d, window_step=%d, npos=%d, spos=%f\n",n,window_size,window_step,nsteps,spos);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
87 for(i=0;i<nsteps;i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
88 // advance end if needed
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
89 double ep=wpos+window_size;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
90 while(ce<n && pos[ce]<=ep) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
91 ctc++; ce++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
92 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
93 // advance start
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
94 while(cs<n && pos[cs]<wpos) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
95 ctc--; cs++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
96 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
97 dout[i]=ctc;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
98 // advance window position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
99 wpos+=window_step;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
100 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
101 UNPROTECT(1);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
102 return(tc_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
103 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
104
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
105 // tag counts in windows around specified positions
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
106 // pos - tag positions
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
107 // ntags - number of tags in each position
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
108 // wpos - window positions
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
109 // returns a pos-length vector giving number of tags that fall within window_half_size from the provided positions
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
110 SEXP cwindow_n_tags_around(SEXP pos_R, SEXP ntags_R, SEXP wpos_R, SEXP window_half_size_R) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
111 double* pos=REAL(pos_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
112 int* ntags=INTEGER(ntags_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
113 int n=LENGTH(pos_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
114 double* wpos=REAL(wpos_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
115 int nw=LENGTH(wpos_R); // number of windows
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
116 double whs=(double) *INTEGER(window_half_size_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
117
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
118 // allocate return array
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
119 SEXP tc_R;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
120 PROTECT(tc_R=allocVector(INTSXP,nw));
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
121 int* dout=INTEGER(tc_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
122
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
123 int i;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
124 int cs=0; int ce=0; // current array start/end indecies
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
125 int ctc=0; // current tag count
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
126 for(i=0;i<nw;i++) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
127 //if(i>(nw-2)) { Rprintf("-i=%d; cs=%d, ce=%d; ctc=%d\n",i,cs,ce,ctc); }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
128 // advance end if needed
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
129 double ep=wpos[i]+whs;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
130 while(ce<n && pos[ce]<=ep) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
131 ctc+=ntags[ce]; ce++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
132 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
133 // advance start
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
134 double sp=wpos[i]-whs;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
135 while(cs<n && pos[cs]<sp) {
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
136 ctc-=ntags[cs]; cs++;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
137 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
138 dout[i]=ctc;
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
139 // if(i>(nw-2)) { Rprintf("+i=%d; cs=%d, ce=%d; ctc=%d\n",i,cs,ce,ctc); }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
140 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
141 UNPROTECT(1);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
142 return(tc_R);
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
143 }
ce08b0efa3fd Uploaded
zzhou
parents:
diff changeset
144