TPCCLIB
Loading...
Searching...
No Matches
vessel.c
Go to the documentation of this file.
1
5/*****************************************************************************/
6#include "libtpcidi.h"
7/*****************************************************************************/
8
9/*****************************************************************************/
28 VOL *vol,
30 int zi,
32 double cx,
34 double cy,
36 double r,
38 double FWHM,
40 double cbkg,
42 double cblo
43) {
44 double s, dx, dy, d, v;
45 int xi, yi;
46
47 if(vol->status!=IMG_STATUS_OCCUPIED) return(1);
48 if(zi<0 || zi>=vol->dimz) return(2);
49 if(vol->sizey<=0.0 || vol->sizex<=0.0) return(3);
50
51 s=FWHM/2.354820; // 2*sqrt(2*ln(2))
52 v=cblo-cbkg;
53 for(yi=0; yi<vol->dimy; yi++) {
54 dy=(0.5+(double)yi)*vol->sizey - cy;
55 for(xi=0; xi<vol->dimx; xi++) {
56 dx=(0.5+(double)xi)*vol->sizex - cx;
57 vol->v[zi][yi][xi]=0.0;
58 d=hypot(dx-0.25*vol->sizex, dy-0.25*vol->sizey);
59 vol->v[zi][yi][xi]+=(v/2.0)*( erf((d+r)/(M_SQRT2*s)) - erf((d-r)/(M_SQRT2*s)) );
60 d=hypot(dx-0.25*vol->sizex, dy+0.25*vol->sizey);
61 vol->v[zi][yi][xi]+=(v/2.0)*( erf((d+r)/(M_SQRT2*s)) - erf((d-r)/(M_SQRT2*s)) );
62 d=hypot(dx+0.25*vol->sizex, dy-0.25*vol->sizey);
63 vol->v[zi][yi][xi]+=(v/2.0)*( erf((d+r)/(M_SQRT2*s)) - erf((d-r)/(M_SQRT2*s)) );
64 d=hypot(dx+0.25*vol->sizex, dy+0.25*vol->sizey);
65 vol->v[zi][yi][xi]+=(v/2.0)*( erf((d+r)/(M_SQRT2*s)) - erf((d-r)/(M_SQRT2*s)) );
66 vol->v[zi][yi][xi]*=0.25;
67 vol->v[zi][yi][xi]+= cbkg;
68 }
69 }
70
71 return(0);
72}
73/*****************************************************************************/
74
75/*****************************************************************************/
84 IMG *img,
86 int zi,
88 double cx,
90 double cy,
92 double r,
94 double *cbkg,
97 double *cblo
98) {
99 double dx1, dy1, dx2, dy2, d1, d2, d3, d4, r2;
100 int xi, yi, fi, n;
101
102 if(img->status!=IMG_STATUS_OCCUPIED) return(1);
103 if(zi<0 || zi>=img->dimz) return(2);
104 if(img->sizey<=0.0 || img->sizex<=0.0) return(3);
105
106 /* Simulate the circle */
107 r2=r*r;
108 for(yi=0; yi<img->dimy; yi++) {
109 dy1=dy2=(0.5+(double)yi)*img->sizey - cy;
110 dy1-=0.25*img->sizey; dy2+=0.25*img->sizey;
111 for(xi=0; xi<img->dimx; xi++) {
112 dx1=dx2=(0.5+(double)xi)*img->sizex - cx;
113 dx1-=0.25*img->sizex; dx2+=0.25*img->sizex;
114 d1=dx1*dx1+dy1*dy1; d2=dx1*dx1+dy2*dy2;
115 d3=dx2*dx2+dy1*dy1; d4=dx2*dx2+dy2*dy2;
116 n=0; if(d1<=r2) n++; if(d2<=r2) n++; if(d3<=r2) n++; if(d4<=r2) n++;
117 for(fi=0; fi<img->dimt; fi++)
118 img->m[zi][yi][xi][fi]=0.25*((double)n*cblo[fi]+(double)(4-n)*cbkg[fi]);
119 }
120 }
121
122 return(0);
123}
124/*****************************************************************************/
125
126/*****************************************************************************/
145 int simmet,
148 IMG *img,
150 int zi,
152 double cx,
154 double cy,
156 double r,
158 double FWHM,
160 double *cbkg,
163 double *cblo
164) {
165 int xi, yi, fi;
166
167 if(img->status!=IMG_STATUS_OCCUPIED) return(1);
168 if(zi<0 || zi>=img->dimz) return(2);
169 if(img->sizey<=0.0 || img->sizex<=0.0) return(3);
170 if(cbkg==NULL || cblo==NULL) return(4);
171
172 double d, s=FWHM/2.354820; // 2*sqrt(2*ln(2))
173
174 if(simmet==0) { // Germano
175 double v, w1, w2, w3, w4, dy, dx;
176 for(yi=0; yi<img->dimy; yi++) {
177 dy=(0.5+(double)yi)*img->sizey - cy;
178 for(xi=0; xi<img->dimx; xi++) {
179 dx=(0.5+(double)xi)*img->sizex - cx;
180 d=hypot(dx-0.25*img->sizex, dy-0.25*img->sizey);
181 w1=0.5*( erf((d+r)/(M_SQRT2*s)) - erf((d-r)/(M_SQRT2*s)) );
182 d=hypot(dx-0.25*img->sizex, dy+0.25*img->sizey);
183 w2=0.5*( erf((d+r)/(M_SQRT2*s)) - erf((d-r)/(M_SQRT2*s)) );
184 d=hypot(dx+0.25*img->sizex, dy-0.25*img->sizey);
185 w3=0.5*( erf((d+r)/(M_SQRT2*s)) - erf((d-r)/(M_SQRT2*s)) );
186 d=hypot(dx+0.25*img->sizex, dy+0.25*img->sizey);
187 w4=0.5*( erf((d+r)/(M_SQRT2*s)) - erf((d-r)/(M_SQRT2*s)) );
188 for(fi=0; fi<img->dimt; fi++) {
189 v=cblo[fi]-cbkg[fi];
190 img->m[zi][yi][xi][fi]= 0.25*v*(w1+w2+w3+w4) + cbkg[fi];
191 }
192 }
193 }
194 } else { // Vessel without PVE
195 double dx1, dy1, dx2, dy2, d1, d2, d3, d4, r2;
196 int n;
197 /* Simulate the circle */
198 r2=r*r;
199 for(yi=0; yi<img->dimy; yi++) {
200 dy1=dy2=(0.5+(double)yi)*img->sizey - cy;
201 dy1-=0.25*img->sizey; dy2+=0.25*img->sizey;
202 for(xi=0; xi<img->dimx; xi++) {
203 dx1=dx2=(0.5+(double)xi)*img->sizex - cx;
204 dx1-=0.25*img->sizex; dx2+=0.25*img->sizex;
205 d1=dx1*dx1+dy1*dy1; d2=dx1*dx1+dy2*dy2;
206 d3=dx2*dx2+dy1*dy1; d4=dx2*dx2+dy2*dy2;
207 n=0; if(d1<=r2) n++; if(d2<=r2) n++; if(d3<=r2) n++; if(d4<=r2) n++;
208 for(fi=0; fi<img->dimt; fi++)
209 img->m[zi][yi][xi][fi]=0.25*((double)n*cblo[fi]+(double)(4-n)*cbkg[fi]);
210 }
211 }
212 }
213
214 return(0);
215}
216/*****************************************************************************/
217
218/*****************************************************************************/
Header file for libtpcidi.
#define IMG_STATUS_OCCUPIED
float sizex
unsigned short int dimx
float **** m
char status
unsigned short int dimt
float sizey
unsigned short int dimz
unsigned short int dimy
char status
unsigned short int dimx
unsigned short int dimy
unsigned short int dimz
float sizex
float *** v
float sizey
int idiSimulateTubeImgPlane(int simmet, IMG *img, int zi, double cx, double cy, double r, double FWHM, double *cbkg, double *cblo)
Definition vessel.c:143
int idiSimulateTubeImg(IMG *img, int zi, double cx, double cy, double r, double *cbkg, double *cblo)
Definition vessel.c:81
int idiSimulateTubeVol(VOL *vol, int zi, double cx, double cy, double r, double FWHM, double cbkg, double cblo)
Definition vessel.c:26