TPCCLIB
Loading...
Searching...
No Matches
pbconv.h File Reference

Header file for pbconv.c. More...

Go to the source code of this file.

Enumerations

enum  tracerCode {
  NORBC , INWATER , FDG , FLUORIDE ,
  FBPA , FDOPA , MEAIB , PIB ,
  FLUMAZENIL , AH690 , AH691 , FMPEPD2 ,
  PALMITATE , PK11195 , PE2I , CARFENTANIL ,
  METOMIDATE , ORMB , PBR28HAB , PBR28MAB ,
  PBR28LAB , SMW139 , UCBJ , MOUSEFDG1 ,
  MOUSEFDG2 , RATFDG
}
 

Functions

int tracer_code (char *tracer)
 
int rbc_plasma_ratio (int tracer, double *t, double *r, int nr)
 
int plasma_to_blood_ratio (int tracer, double *t, double *r, int nr)
 

Detailed Description

Header file for pbconv.c.

Author
Vesa Oikonen

Definition in file pbconv.h.

Enumeration Type Documentation

◆ tracerCode

enum tracerCode

Codes for PET tracers

Definition at line 11 of file pbconv.h.

11 {NORBC,INWATER,FDG,FLUORIDE,FBPA,FDOPA,MEAIB,PIB,FLUMAZENIL,
12 AH690,AH691,FMPEPD2,
13 PALMITATE,PK11195,PE2I,CARFENTANIL,METOMIDATE,ORMB,
14 PBR28HAB,PBR28MAB,PBR28LAB,SMW139,UCBJ,
15 MOUSEFDG1,MOUSEFDG2,RATFDG
16 } tracerCode;
tracerCode
Definition pbconv.h:11

Function Documentation

◆ plasma_to_blood_ratio()

int plasma_to_blood_ratio ( int tracer,
double * t,
double * r,
int nr )

Calculates plasma/blood ratio curve using specific functions and population average parameters. This function can only be used when the impact of variable hematocrit can be ignored.

Returns
Returns non-zero in case an error is encountered, and specifically -1 if tracer code is unknown.
Author
Vesa Oikonen
See also
rbc_plasma_ratio, tracer_code
Parameters
tracertracerCode
tSample times (minutes from tracer injection)
rPointer to preallocated array where plasma/blood ratio will be written
nrNr of samples

Definition at line 248 of file pbconv.c.

257 {
258 int i;
259 double K, K2, A, B, C, D;
260
261 /* Check the arguments */
262 if(t==NULL || r==NULL || nr<1) return(1);
263
264 /* Calculate the plasma/blood ratio curve */
265 switch(tracer) {
266 case INWATER:
267 case METOMIDATE:
269 for(i=1; i<nr; i++)
270 r[i]=r[0];
271 break;
272 case FLUORIDE:
273 // From Hawkins et al., JNM 1992;33:633-642.
274 A=1.23; B=-0.00123;
275 for(i=0; i<nr; i++) r[i]= A+B*t[i];
276 break;
277 case MOUSEFDG1:
278 // From Yu et al JNM 2009;50(6):966-973, referring to Wu et al JNM 2007;48(5):837-845.
279 A=0.39; K=0.19; C=1.17;
280 for(i=0; i<nr; i++) r[i]= A*exp(-K*t[i]) + C;
281 break;
282 case MOUSEFDG2:
283 // From Huang et al JNM 2017;58(4):611-616.
284 A=0.619; K=0.0842; C=1.051;
285 for(i=0; i<nr; i++) r[i]= A*exp(-K*t[i]) + C;
286 break;
287 case RATFDG:
288 // From Weber et al Eur J Nucl Med 2002;29:319–323.
289 A=0.51; K=4.79; B=0.3; K2=337.; C=0.8;
290 for(i=0; i<nr; i++)
291 r[i]= A*exp(-(M_LN2/K)*t[i]) + B*exp(-(M_LN2/K2)*t[i]) + C;
292 break;
293 case PBR28HAB:
294 // From TPC analysis
295 A=-4.374460E-001; B=2.515638E+000; C=2.945167E+003; D=1.154175E+000;
296 for(i=0; i<nr; i++) {K=pow(t[i], B); r[i]=1.0/((A*K/(K+C))+D);}
297 break;
298 case PBR28MAB:
299 // From TPC analysis
300 A=-2.516136E-001; B=1.713713E+000; C=2.349197E+002; D=9.116462E-001;
301 for(i=0; i<nr; i++) {K=pow(t[i], B); r[i]=1.0/((A*K/(K+C))+D);}
302 break;
303 case PBR28LAB:
304 // From TPC analysis
305 A=8.020889E-002; B=1.835577E+000; C=1.908775E+001; D=5.329330E-001;
306 for(i=0; i<nr; i++) {K=pow(t[i], B); r[i]=1.0/((A*K/(K+C))+D);}
307 break;
308 default:
309 return(-1);
310 }
311
312 return(0);
313}
#define M_LN2
Definition libtpcmisc.h:90
#define BLOOD_WATER
Definition pbconv.c:21
#define PLASMA_WATER
Definition pbconv.c:19

◆ rbc_plasma_ratio()

int rbc_plasma_ratio ( int tracer,
double * t,
double * r,
int nr )

Calculates RBC/PL ratio curve using specific functions and population average parameters.

Returns
Returns non-zero in case an error is encountered, and specifically -1 if tracer code is unknown.
Author
Vesa Oikonen
See also
plasma_to_blood_ratio, tracer_code
Parameters
tracertracerCode
tSample times (minutes from tracer injection)
rPointer to preallocated array where RBC/plasma ratio will be written
nrNr of samples

Definition at line 83 of file pbconv.c.

92 {
93 int i;
94 double K, A, B, C, D, Rmax, Th, dt;
95
96 /* Check the arguments */
97 if(t==NULL || r==NULL || nr<1) return(1);
98
99 /* Calculate the population average RBC/PL ratio curve */
100 switch(tracer) {
101 case NORBC:
102 for(i=0; i<nr; i++)
103 r[i]= 0.0;
104 break;
105 case INWATER:
106 case METOMIDATE:
107 r[0]=(RBC_WATER/PLASMA_WATER);
108 for(i=1; i<nr; i++)
109 r[i]=r[0];
110 break;
111 case FDG:
112 K=0.0012; B=0.80;
113 for(i=0; i<nr; i++)
114 r[i]= K*t[i] + B;
115 break;
116 case FBPA:
117 K=0.00888; B=0.0;
118 for(i=0; i<nr; i++)
119 r[i]= K*t[i] + B;
120 break;
121 case FDOPA:
122 Rmax=1.446; Th=83.56;
123 for(i=0; i<nr; i++)
124 r[i]= (Rmax*t[i]) / (Th + t[i]);
125 break;
126 case MEAIB:
127 K=0.00398; B=0.0;
128 for(i=0; i<nr; i++)
129 r[i]= K*t[i] + B;
130 break;
131 case PIB:
132 /*A=9.470E-01; B=1.9200E+00; C=8.2395E+01;*/
133 A=7.4150E-01; B=4.0618E+00; C=1.2182E+04;
134 for(i=0; i<nr; i++) {
135 r[i]= 1.0 - (A*pow(t[i], B)/(pow(t[i], B) + C));
136 r[i]*= (RBC_WATER/PLASMA_WATER);
137 }
138 break;
139 case FLUMAZENIL:
140 A=6.89E-01; B=6.89E-01; C=4.57E+01;
141 for(i=0; i<nr; i++) {
142 r[i]= 1.0 - (A*pow(t[i], B)/(pow(t[i], B) + C));
143 r[i]*= (RBC_WATER/PLASMA_WATER);
144 }
145 break;
146 case AH690:
147 A=7.6467E-01; B=2.0124E+00; C=5.1609E+01; D=1.1381E-03;
148 for(i=0; i<nr; i++)
149 r[i]= 1.0 - (A*pow(t[i], B)/(pow(t[i], B) + C) + D*t[i]);
150 break;
151 case AH691:
152 A=8.1894E-01; B=1.1967E+00; C=1.7223E+00; D=1.1873E-03;
153 for(i=0; i<nr; i++)
154 r[i]= 1.0 - (A*pow(t[i], B)/(pow(t[i], B) + C) + D*t[i]);
155 break;
156 case FMPEPD2: // based on measurements in TPC
157 A=1.07741e+001; B=1.29526e+001; C=1.28; D=3.7e-002;
158 for(i=0; i<nr; i++) {
159 dt=t[i]-0.5;
160 if(dt<=0.0) r[i]=0.0; else {
161 r[i]= (C*pow(dt, C-1.0))/(pow(B, C)+pow(dt, C)) -
162 (C*pow(dt, 2.0*C-1.0))/pow(pow(B, C)+pow(dt, C), 2.0) +
163 (D*pow(dt, C))/(pow(B, C)+pow(dt, C));
164 r[i]*=A;
165 }
166 }
167 break;
168 case PALMITATE:
169 A=3.906489E-003; B=-9.939087E-002; C=2.713401E-004; D=4.740762E-003;
170 for(i=0; i<nr; i++) {
171 dt=t[i]-5.0;
172 if(dt<0.0) r[i]=0.0; else
173 r[i]= (A*dt + C*dt*dt) / (1.0 + B*dt + D*dt*dt);
174 }
175 break;
176 case PK11195:
177 A=1.9087E-01; B=3.0773E+00; C=2.8266E+02;
178 for(i=0; i<nr; i++) {
179 r[i]= A*pow(t[i], B)/(pow(t[i], B) + C);
180 }
181 break;
182 case PE2I:
183 A=2.063642; B=7.460386E-001; C=6.812810E+001;
184 for(i=0; i<nr; i++) {
185 r[i]= A*pow(t[i], B)/(pow(t[i], B) + C);
186 }
187 break;
188 case CARFENTANIL: // based on 8 studies in TPC
189 A=1.857965E-001; B=5.388415; C=1.344971E+007; D=3.015209E-001;
190 for(i=0; i<nr; i++) {
191 r[i]= A*pow(t[i], B)/(pow(t[i], B) + C) + D;
192 }
193 break;
194 case ORMB:
195 A=0.4281961; B=1.14880; C=4.013195; D=1.863528;
196 for(i=0; i<nr; i++) {
197 dt=t[i]-D;
198 if(dt<=0.0) r[i]=0.0;
199 else r[i]= A*pow(t[i], B)/(pow(t[i], B) + C);
200 }
201/*
202 A=0.428495; B=1.307704; C=7.609658;
203 for(i=0; i<nr; i++) {
204 r[i]= A*pow(t[i], B)/(pow(t[i], B) + C);
205 }
206*/
207 break;
208 case SMW139:
209 // From TPC analysis, n=14
210 A=0.006459; B=0.06913; C=0.1278;
211 for(i=0; i<nr; i++) {
212 double e=exp(-B*t[i]);
213 r[i]=A*(t[i]*e + (C/(B*B))*(1.0-(B*t[i]+1.0)*e));
214 }
215 break;
216 case UCBJ:
217 // Median parameters from TPC analysis, n=7
218 {
219 double A1=0.691911;
220 double L1=0.9;
221 double A2=0.174026;
222 double L2=0.029;
223 double A3=0.357205;
224 double L3=-0.004;
225 for(i=0; i<nr; i++) {
226 if(!(t[i]>0.0)) r[i]=0.0;
227 else r[i]=(A1*t[i] - A2 - A3)*exp(-L1*t[i]) + A2*exp(-L2*t[i]) + A3*exp(-L3*t[i]);
228 }
229 }
230 break;
231
232 default:
233 return(-1);
234 }
235
236 return(0);
237}
#define RBC_WATER
Definition pbconv.c:23

◆ tracer_code()

int tracer_code ( char * tracer)

Identify the tracer based on given string. Tracer code enums (tracerCode) can be found in pbconv.h.

Returns
Returns the tracer code or a negative number if tracer is unknown.
See also
rbc_plasma_ratio, plasma_to_blood_ratio
Parameters
tracerString containing the name of the tracer

Definition at line 32 of file pbconv.c.

35 {
36 //printf("tracer='%s'\n", tracer);
37 if(strcasecmp(tracer, "NORBC")==0) return(NORBC);
38 if(strcasecmp(tracer, "INWATER")==0) return(INWATER);
39 if(strcasecmp(tracer, "FTHA")==0) return(NORBC);
40 if(strcasecmp(tracer, "FDG")==0) return(FDG);
41 if(strcasecmp(tracer, "FLUORIDE")==0) return(FLUORIDE);
42 if(strcasecmp(tracer, "FBPA")==0) return(FBPA);
43 if(strcasecmp(tracer, "FDOPA")==0) return(FDOPA);
44 if(strcasecmp(tracer, "MEAIB")==0) return(MEAIB);
45 if(strcasecmp(tracer, "6OHBTA1")==0) return(PIB);
46 if(strcasecmp(tracer, "PIB")==0) return(PIB);
47 if(strncasecmp(tracer, "FLUMAZENIL", 3)==0) return(FLUMAZENIL);
48 if(strncasecmp(tracer, "AH690", 5)==0) return(AH690);
49 if(strncasecmp(tracer, "AH691", 5)==0) return(AH691);
50 if(strcasecmp(tracer, "FMPEP-D2")==0) return(FMPEPD2);
51 if(strncasecmp(tracer, "FMPEPD2", 5)==0) return(FMPEPD2);
52 if(strncasecmp(tracer, "PALMITATE", 4)==0) return(PALMITATE);
53 if(strcasecmp(tracer, "PK11195")==0) return(PK11195);
54 if(strcasecmp(tracer, "PE2I")==0) return(PE2I);
55 if(strcasecmp(tracer, "CARFENTANIL")==0) return(CARFENTANIL);
56 if(strcasecmp(tracer, "METOMIDATE")==0) return(METOMIDATE);
57 if(strcasecmp(tracer, "MTO")==0) return(METOMIDATE);
58 if(strcasecmp(tracer, "ORM-B")==0) return(ORMB);
59 if(strcasecmp(tracer, "ORMB")==0) return(ORMB);
60 if(strcasecmp(tracer, "PBR28HAB")==0) return(PBR28HAB);
61 if(strcasecmp(tracer, "PBR28MAB")==0) return(PBR28MAB);
62 if(strcasecmp(tracer, "PBR28LAB")==0) return(PBR28LAB);
63 if(strcasecmp(tracer, "SMW139")==0) return(SMW139);
64 if(strcasecmp(tracer, "UCB-J")==0) return(UCBJ);
65 if(strcasecmp(tracer, "UCBJ")==0) return(UCBJ);
66 if(strcasecmp(tracer, "MOUSEFDG2")==0) return(MOUSEFDG2);
67 if(strcasecmp(tracer, "MOUSEFDG1")==0) return(MOUSEFDG1);
68 if(strcasecmp(tracer, "MOUSEFDG")==0) return(MOUSEFDG1);
69 if(strcasecmp(tracer, "FDGMOUSE")==0) return(MOUSEFDG1);
70 if(strcasecmp(tracer, "RATFDG")==0) return(RATFDG);
71 if(strcasecmp(tracer, "FDGRAT")==0) return(RATFDG);
72 return(-1);
73}