TPCCLIB
Toggle main menu visibility
Loading...
Searching...
No Matches
libtpcidi
vessel.c
Go to the documentation of this file.
1
5
/*****************************************************************************/
6
#include "
libtpcidi.h
"
7
/*****************************************************************************/
8
9
/*****************************************************************************/
26
int
idiSimulateTubeVol
(
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
/*****************************************************************************/
81
int
idiSimulateTubeImg
(
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
/*****************************************************************************/
143
int
idiSimulateTubeImgPlane
(
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
/*****************************************************************************/
libtpcidi.h
Header file for libtpcidi.
IMG_STATUS_OCCUPIED
#define IMG_STATUS_OCCUPIED
Definition
libtpcimgio.h:1479
IMG
Definition
libtpcimgio.h:1657
IMG::sizex
float sizex
Definition
libtpcimgio.h:1714
IMG::dimx
unsigned short int dimx
Definition
libtpcimgio.h:1780
IMG::m
float **** m
Definition
libtpcimgio.h:1799
IMG::status
char status
Definition
libtpcimgio.h:1665
IMG::dimt
unsigned short int dimt
Definition
libtpcimgio.h:1778
IMG::sizey
float sizey
Definition
libtpcimgio.h:1716
IMG::dimz
unsigned short int dimz
Definition
libtpcimgio.h:1784
IMG::dimy
unsigned short int dimy
Definition
libtpcimgio.h:1782
VOL
Definition
libtpcimgio.h:1904
VOL::status
char status
Definition
libtpcimgio.h:1906
VOL::dimx
unsigned short int dimx
Definition
libtpcimgio.h:1918
VOL::dimy
unsigned short int dimy
Definition
libtpcimgio.h:1920
VOL::dimz
unsigned short int dimz
Definition
libtpcimgio.h:1922
VOL::sizex
float sizex
Definition
libtpcimgio.h:1912
VOL::v
float *** v
Definition
libtpcimgio.h:1934
VOL::sizey
float sizey
Definition
libtpcimgio.h:1914
idiSimulateTubeImgPlane
int idiSimulateTubeImgPlane(int simmet, IMG *img, int zi, double cx, double cy, double r, double FWHM, double *cbkg, double *cblo)
Definition
vessel.c:143
idiSimulateTubeImg
int idiSimulateTubeImg(IMG *img, int zi, double cx, double cy, double r, double *cbkg, double *cblo)
Definition
vessel.c:81
idiSimulateTubeVol
int idiSimulateTubeVol(VOL *vol, int zi, double cx, double cy, double r, double FWHM, double cbkg, double cblo)
Definition
vessel.c:26
Generated on
for TPCCLIB by
1.17.0