TPCCLIB
Loading...
Searching...
No Matches
siminput.c
Go to the documentation of this file.
1
8/*****************************************************************************/
9#include "tpcclibConfig.h"
10/*****************************************************************************/
11#include <stdio.h>
12#include <stdlib.h>
13#include <string.h>
14#include <math.h>
15/*****************************************************************************/
16#include "tpcextensions.h"
17#include "tpcift.h"
18#include "tpctac.h"
19#include "tpcli.h"
20#include "tpccm.h"
21#include "tpcpar.h"
22#include "tpctacmod.h"
23/*****************************************************************************/
24
25/*****************************************************************************/
26static char *info[] = {
27 "Compartmental model simulation of input function.",
28 "Not ready for use.",
29 " ",
30 "Usage: @P [Options] parfile [outputfile] ",
31 " ",
32 "Options:",
33 " -i=<Interval (s)>",
34 " Sample time interval; too long interval as compared to rate constants",
35 " leads to bias; by default 1 s.",
36 " -end=<End time (s)",
37 " Duration of simulation; by default 3600 s.",
38 " -stdoptions", // List standard options like --help, -v, etc
39 " ",
40 "To create a template parameter file, do not enter names for other files.",
41 "If parameter file does not contain units, then per sec and per mL units",
42 "are assumed.",
43 " ",
44 "Example 1: creating template parameter file",
45 " @P input.par",
46 "Example 2: simulating input TAC using parameter file",
47 " @P -i=1 -end=3600 input.par simulated.tac",
48 " ",
49 "See also: sim_pkcp, sim_av, sim_3tcm, simframe",
50 " ",
51 "Keywords: input, simulation",
52 0};
53/*****************************************************************************/
54
55/*****************************************************************************/
56/* Turn on the globbing of the command line, since it is disabled by default in
57 mingw-w64 (_dowildcard=0); in MinGW32 define _CRT_glob instead, if necessary;
58 In Unix&Linux wildcard command line processing is enabled by default. */
59/*
60#undef _CRT_glob
61#define _CRT_glob -1
62*/
63int _dowildcard = -1;
64/*****************************************************************************/
65
66/*****************************************************************************/
71int icmparcGetPARs(
73 ICMPARC *d,
75 PAR *par,
77 const int verbose
78) {
79 if(d==NULL || par==NULL) return(1);
80 if(verbose>0) printf("%s()\n", __func__);
81
82
83
84
85
86 return(1);
87}
88/*****************************************************************************/
89
90/*****************************************************************************/
94int simPTAC(
96 double *t,
98 const int nr,
100 double Ti,
102 double kav,
104 double k11,
106 double k12,
108 double ku,
110 double *cp
111) {
112 /* Check for data */
113 if(nr<2) return 1;
114 if(cp==NULL) return 2;
115
116 double cv[nr];
117
118 double t_last=0.0; if(t[0]<t_last) t_last=t[0];
119 double ca_last=0.0;
120 double cv_last=0.0;
121 double ct1_last=0.0;
122 double cai=0.0, cai_last=0.0;
123 double cvi=0.0, cvi_last=0.0;
124 double ct1i=0.0, ct1i_last=0.0;
125 double ct1=0.0;
126
127 /* Calculate curves */
128 for(int i=0; i<nr; i++) {
129 /* delta time / 2 */
130 double dt2=0.5*(t[i]-t_last);
131 if(dt2<0.0) {
132 return(5);
133 } else if(dt2>0.0) {
134 /* Infusion integral; during infusion: time*level, thereafter (infusion time)*level
135 and level is set to 1. */
136 double ii; if(t[i]<=0.0) ii=0.0; else if(t[i]<Ti) ii=t[i]; else ii=Ti;
137 /* Helpers */
138 double bca=cai_last+dt2*ca_last;
139 double bcv=cvi_last+dt2*cv_last;
140 double bct1=ct1i_last+dt2*ct1_last;
141 /* Cv */
142 cv[i]=(ii-(kav-k11*k12*kav*dt2*dt2/((1.0+(k11+ku)*dt2)*(1.0+k12*dt2)))*bcv
143 + k11*k12*dt2*bca/((1.0+(k11+ku)*dt2)*(1.0+k12*dt2))
144 + k12*bct1/(1.0+k12*dt2)
145 ) / (1.0 + dt2*(kav - (k11*k12*kav*dt2*dt2)/((1.0+(k11+ku)*dt2)*(1.0+k12*dt2))));
146 cvi+=dt2*(cv[i]+cv_last);
147 cp[i]=(kav*cvi - (k11+ku)*bca) / (1 + dt2*(k11+ku));
148 cai+=dt2*(cp[i]+ca_last);
149 ct1=(k11*cai - k12*bct1) / (1 + k12*dt2);
150 ct1i+=dt2*(ct1+ct1_last);
151 }
152
153
154 /* prepare to the next sample */
155 t_last=t[i];
156 ca_last=cp[i];
157 cv_last=cv[i];
158 ct1_last=ct1;
159 cai_last=cai;
160 cvi_last=cvi;
161 ct1i_last=ct1i;
162 }
163
164 return 0;
165}
166/*****************************************************************************/
167
168/*****************************************************************************/
172int main(int argc, char **argv)
173{
174 int ai, help=0, version=0, verbose=1;
175 char simfile[FILENAME_MAX], parfile[FILENAME_MAX];
176 double interval=1.0, duration=3600.0;
177
178
179 /*
180 * Get arguments
181 */
182 if(argc==1) {tpcPrintUsage(argv[0], info, stderr); return(1);}
183 parfile[0]=simfile[0]=(char)0;
184 /* Options */
185 for(ai=1; ai<argc; ai++) if(*argv[ai]=='-') {
186 if(tpcProcessStdOptions(argv[ai], &help, &version, &verbose)==0) continue;
187 char *cptr=argv[ai]+1; if(*cptr=='-') cptr++; if(!*cptr) continue;
188 if(strncasecmp(cptr, "I=", 2)==0) {
189 interval=atofVerified(cptr+2); if(interval>0.0) continue;
190 } else if(strncasecmp(cptr, "END=", 4)==0) {
191 duration=atofVerified(cptr+4); if(duration>0.0) continue;
192 }
193 fprintf(stderr, "Error: invalid option '%s'.\n", argv[ai]);
194 return(1);
195 } else break; // tac name argument may start with '-'
196
197 TPCSTATUS status; statusInit(&status);
198 statusSet(&status, __func__, __FILE__, __LINE__, TPCERROR_OK);
199 status.verbose=verbose-1;
200
201 /* Print help or version? */
202 if(help==2) {tpcHtmlUsage(argv[0], info, ""); return(0);}
203 if(help) {tpcPrintUsage(argv[0], info, stdout); return(0);}
204 if(version) {tpcPrintBuild(argv[0], stdout); return(0);}
205
206 /* Process other arguments, starting from the first non-option */
207 if(ai<argc) strlcpy(parfile, argv[ai++], FILENAME_MAX);
208 if(ai<argc) {strlcpy(simfile, argv[ai++], FILENAME_MAX);}
209 if(ai<argc) {
210 fprintf(stderr, "Error: invalid argument '%s'.\n", argv[ai]);
211 return(1);
212 }
213
214 /* Is something missing? */
215 if(!parfile[0]) {
216 fprintf(stderr, "Error: missing parameter file name; use option --help\n");
217 return(1);
218 }
219
220 /* In verbose mode print arguments and options */
221 if(verbose>1) {
222 printf("parfile := %s\n", parfile);
223 if(simfile[0]) printf("simfile := %s\n", simfile);
224 printf("duration := %g\n", duration);
225 printf("interval := %g\n", interval);
226 fflush(stdout);
227 }
228
229
230 /*
231 * Make template parameter file, if no other file names were given, and then quit
232 */
233 if(!simfile[0]) {
234 PAR par; parInit(&par);
235 if(parAllocate(&par, 20, 1)) {
236 fprintf(stderr, "Error: cannot allocate memory for parameters.\n");
237 parFree(&par); return(1);
238 }
239
240#if(0)
241 int pi=0;
242 strcpy(par.n[pi].name, "Ti"); par.n[pi].unit=UNIT_SEC;
243 pi++; strcpy(par.n[pi].name, "Kav"); par.n[pi].unit=UNIT_PER_SEC;
244 pi++; strcpy(par.n[pi].name, "K11"); par.n[pi].unit=UNIT_PER_SEC;
245 pi++; strcpy(par.n[pi].name, "K12"); par.n[pi].unit=UNIT_PER_SEC;
246 pi++; strcpy(par.n[pi].name, "Ku"); par.n[pi].unit=UNIT_PER_SEC;
247 par.parNr=pi+1;
248#endif
249
250 int ti=0;
251 sprintf(par.r[ti].name, "tac%d", 1+ti);
252 par.r[ti].model=0;
253 par.tacNr=1;
254
255 int pi=0;
256 /* Administered parent tracer */
257 strcpy(par.n[pi].name, "p_Ti"); par.n[pi].unit=UNIT_SEC; par.r[ti].p[pi]=1.0;
258 pi++; strcpy(par.n[pi].name, "p_Tdur"); par.n[pi].unit=UNIT_SEC; par.r[ti].p[pi]=15.0;
259 pi++; strcpy(par.n[pi].name, "p_Irate"); par.n[pi].unit=UNIT_SEC_KBQ_PER_ML; par.r[ti].p[pi]=1.0E+04;
260 pi++; strcpy(par.n[pi].name, "p_VA"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=1.0;
261 pi++; strcpy(par.n[pi].name, "p_AT1"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.5;
262 pi++; strcpy(par.n[pi].name, "p_T1V"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.5;
263 pi++; strcpy(par.n[pi].name, "p_AT2"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.5;
264 pi++; strcpy(par.n[pi].name, "p_T2V"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.1;
265 pi++; strcpy(par.n[pi].name, "p_AU"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.01;
266
267 /* Metabolite 1 of parent tracer*/
268 pi++; strcpy(par.n[pi].name, "m1_VA"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=1.0;
269 pi++; strcpy(par.n[pi].name, "m1_AT1"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.5;
270 pi++; strcpy(par.n[pi].name, "m1_T1V"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.5;
271 pi++; strcpy(par.n[pi].name, "m1_AT2"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.5;
272 pi++; strcpy(par.n[pi].name, "m1_T2V"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.1;
273 pi++; strcpy(par.n[pi].name, "m1_AU"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.05;
274 pi++; strcpy(par.n[pi].name, "m1_V"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.0;
275 pi++; strcpy(par.n[pi].name, "m1_T1"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.0;
276 pi++; strcpy(par.n[pi].name, "m1_T2"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.1;
277
278 /* Metabolite 2 of parent tracer */
279 pi++; strcpy(par.n[pi].name, "m2_VA"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=1.0;
280 pi++; strcpy(par.n[pi].name, "m2_AT1"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.5;
281 pi++; strcpy(par.n[pi].name, "m2_T1V"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.5;
282 pi++; strcpy(par.n[pi].name, "m2_AT2"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.5;
283 pi++; strcpy(par.n[pi].name, "m2_T2V"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.1;
284 pi++; strcpy(par.n[pi].name, "m2_AU"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.02;
285 pi++; strcpy(par.n[pi].name, "m2_V"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.0;
286 pi++; strcpy(par.n[pi].name, "m2_T1"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.0;
287 pi++; strcpy(par.n[pi].name, "m2_T2"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.2;
288
289 /* Metabolite 1 of metabolite 2 */
290 pi++; strcpy(par.n[pi].name, "m2m1_VA"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=1.0;
291 pi++; strcpy(par.n[pi].name, "m2m1_AT1"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.5;
292 pi++; strcpy(par.n[pi].name, "m2m1_T1V"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.5;
293 pi++; strcpy(par.n[pi].name, "m2m1_AT2"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.5;
294 pi++; strcpy(par.n[pi].name, "m2m1_T2V"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.1;
295 pi++; strcpy(par.n[pi].name, "m2m1_AU"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.1;
296 pi++; strcpy(par.n[pi].name, "m2m1_V"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.0;
297 pi++; strcpy(par.n[pi].name, "m2m1_T1"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.0;
298 pi++; strcpy(par.n[pi].name, "m2m1_T2"); par.n[pi].unit=UNIT_PER_SEC; par.r[ti].p[pi]=0.5;
299 par.parNr=pi+1;
300
301#if(0)
302 int ti=0;
303 sprintf(par.r[ti].name, "tac%d", 1+ti);
304 par.r[ti].model=0;
305 par.tacNr=1;
306 pi=0; par.r[ti].p[pi]=15.0;
307 pi++; par.r[ti].p[pi]=0.2;
308 pi++; par.r[ti].p[pi]=0.05;
309 pi++; par.r[ti].p[pi]=0.01;
310 pi++; par.r[ti].p[pi]=0.02;
311#endif
312
313 if(verbose>1) printf("writing %s\n", parfile);
314 FILE *fp; fp=fopen(parfile, "w");
315 if(fp==NULL) {
316 fprintf(stderr, "Error: cannot open file for writing (%s)\n", parfile);
317 parFree(&par); return(11);
318 }
319 int ret=parWrite(&par, fp, PAR_FORMAT_TSV_UK, 1, &status);
320 fclose(fp); parFree(&par);
321 if(ret!=TPCERROR_OK) {fprintf(stderr, "Error: cannot write %s\n", parfile); return(11);}
322 return(0);
323 }
324
325
326 /*
327 * Read parameter file to get parameters for the simulation.
328 */
329 if(verbose>1) fprintf(stdout, "reading %s\n", parfile);
330 PAR par; parInit(&par);
331 if(parRead(&par, parfile, &status)) {
332 fprintf(stderr, "Error: %s (%s)\n", errorMsg(status.error), parfile);
333 parFree(&par); return(3);
334 }
335 if(verbose>10) parWrite(&par, stdout, PAR_FORMAT_TSV_UK, 1, NULL);
336 /* Check that there is just one TAC to simulate */
337 if(par.tacNr>0) {
338 fprintf(stderr, "Error: simulation of only one TAC is currently supported.\n");
339 parFree(&par); return(3);
340 }
341 /* Set simulation data structure */
342 ICMPARC sp; icmparcInit(&sp);
343 /* Get and check the model parameters for the parent tracer. */
344 {
345 int ret=0;
346 sp.Ti=parGetParameter(&par, "pTi", 0);
347 if(!(sp.Ti>=0.0)) {fprintf(stderr, "Error: invalid/missing Ti for parent.\n"); ret++;}
348 else if(parGetParameterUnit(&par, "pTi")==UNIT_MIN) sp.Ti*=60.0;
349 sp.Tdur=parGetParameter(&par, "pTdur", 0);
350 if(!(sp.Tdur>0.0)) {fprintf(stderr, "Error: invalid/missing Tdur for parent.\n"); ret++;}
351 else if(parGetParameterUnit(&par, "pTdur")==UNIT_MIN) sp.Tdur*=60.0;
352 sp.Irate=parGetParameter(&par, "pIrate", 0);
353 if(!(sp.Irate>0.0)) {fprintf(stderr, "Error: invalid/missing Irate for parent.\n"); ret++;}
354 else {
355 int u=parGetParameterUnit(&par, "pIrate");
357 if(f>0.0) sp.Irate*=f;
358 }
359 sp.k_BV_BA=parGetParameter(&par, "pVA", 0);
360 if(!(sp.k_BV_BA>0.0)) {fprintf(stderr, "Error: invalid/missing pVA for parent.\n"); ret++;}
361 else if(parGetParameterUnit(&par, "pVA")==UNIT_PER_MIN) sp.k_BV_BA/=60.0;
362
363
364 if(ret) {parFree(&par); icmparcFree(&sp); return(4);}
365 }
366
367#if(0)
368 {
369 int ti, pi, punit;
370 /* Check parameter Ti */
371 pi=parFindParameter(&par, "Ti");
372 if(pi<0) {fprintf(stderr, "Error: missing Ti.\n"); parFree(&par); return(3);}
373 punit=par.n[pi].unit;
374 if(punit==UNIT_MIN) {
375 par.n[pi].unit=UNIT_SEC; for(ti=0; ti<par.tacNr; ti++) par.r[ti].p[pi]*=60.0;
376 }
377 /* Check parameter Kav */
378 pi=parFindParameter(&par, "Kav");
379 if(pi<0) {fprintf(stderr, "Error: missing Kav.\n"); parFree(&par); return(3);}
380 punit=par.n[pi].unit;
381 if(punit==UNIT_PER_MIN) {
382 par.n[pi].unit=UNIT_PER_SEC; for(ti=0; ti<par.tacNr; ti++) par.r[ti].p[pi]/=60.0;
383 }
384 /* Check parameter K11 */
385 pi=parFindParameter(&par, "K11");
386 if(pi<0) {fprintf(stderr, "Error: missing K11.\n"); parFree(&par); return(3);}
387 punit=par.n[pi].unit;
388 if(punit==UNIT_PER_MIN) {
389 par.n[pi].unit=UNIT_PER_SEC; for(ti=0; ti<par.tacNr; ti++) par.r[ti].p[pi]/=60.0;
390 }
391 /* Check parameter K12 */
392 pi=parFindParameter(&par, "K12");
393 if(pi<0) {fprintf(stderr, "Error: missing K12.\n"); parFree(&par); return(3);}
394 punit=par.n[pi].unit;
395 if(punit==UNIT_PER_MIN) {
396 par.n[pi].unit=UNIT_PER_SEC; for(ti=0; ti<par.tacNr; ti++) par.r[ti].p[pi]/=60.0;
397 }
398 /* Check parameter Ku */
399 pi=parFindParameter(&par, "Ku");
400 if(pi<0) {fprintf(stderr, "Error: missing Ku.\n"); parFree(&par); return(3);}
401 punit=par.n[pi].unit;
402 if(punit==UNIT_PER_MIN) {
403 par.n[pi].unit=UNIT_PER_SEC; for(ti=0; ti<par.tacNr; ti++) par.r[ti].p[pi]/=60.0;
404 }
405 if(verbose>1) parWrite(&par, stdout, PAR_FORMAT_TSV_UK, 1, NULL);
406 }
407#endif
408
409
410 /*
411 * Allocate memory for simulated curves
412 */
413 TAC sim; tacInit(&sim);
414 int ret=tacAllocate(&sim, 1+ceil(duration/interval), par.tacNr);
415 if(ret!=TPCERROR_OK) {
416 fprintf(stderr, "Error: cannot allocate memory for simulated data.\n");
417 parFree(&par); return(5);
418 }
419 /* Set file format */
421 /* Set sample times */
422 sim.tunit=UNIT_SEC;
423 sim.isframe=1;
424 for(int i=0; i<sim._sampleNr; i++) {
425 sim.x1[i]=interval*(double)(i);
426 sim.x2[i]=interval*(double)(i+1);
427 sim.x[i]=0.5*interval*(double)(2*i+1);
428 sim.sampleNr++;
429 if(sim.x[i]>=duration) break;
430 }
431 if(verbose>2) printf("sampleNr := %d\n", sim.sampleNr);
432 sim.tacNr=par.tacNr;
433
434 /*
435 * Simulate
436 */
437 for(int ti=0; ti<par.tacNr; ti++) {
438 double Ti=parGetParameter(&par, "Ti", ti);
439 double kav=parGetParameter(&par, "Kav", ti);
440 double k11=parGetParameter(&par, "K11", ti);
441 double k12=parGetParameter(&par, "K12", ti);
442 double ku=parGetParameter(&par, "Ku", ti);
443 if(simPTAC(sim.x, sim.sampleNr, Ti, kav, k11, k12, ku, sim.c[ti].y)!=0) {
444 fprintf(stderr, "Error: cannot simulate.\n");
445 parFree(&par); tacFree(&sim); return(6);
446 }
447 }
448 parFree(&par);
449
450
451 /*
452 * Write the TAC file
453 */
454 if(verbose>1) printf("writing simulated data in %s\n", simfile);
455 FILE *fp; fp=fopen(simfile, "w");
456 if(fp==NULL) {
457 fprintf(stderr, "Error: cannot open file for writing (%s)\n", simfile);
458 tacFree(&sim); return(11);
459 }
460 ret=tacWrite(&sim, fp, TAC_FORMAT_UNKNOWN, 1, &status);
461 fclose(fp); tacFree(&sim);
462 if(ret!=TPCERROR_OK) {
463 fprintf(stderr, "Error: %s\n", errorMsg(status.error));
464 return(12);
465 }
466 if(verbose>=0) printf("Simulated TAC saved in %s\n", simfile);
467
468 return(0);
469}
470/*****************************************************************************/
472/*****************************************************************************/
double atofVerified(const char *s)
Definition decpoint.c:75
void parFree(PAR *par)
Definition par.c:75
int parAllocate(PAR *par, int parNr, int tacNr)
Definition par.c:108
void parInit(PAR *par)
Definition par.c:25
int parWrite(PAR *par, FILE *fp, parformat format, int extra, TPCSTATUS *status)
Definition pario.c:148
int parRead(PAR *par, const char *fname, TPCSTATUS *status)
Definition pario.c:232
double parGetParameter(PAR *d, const char *par_name, const int ti)
Definition parselect.c:242
int parGetParameterUnit(PAR *d, const char *par_name)
Definition parselect.c:267
int parFindParameter(PAR *d, const char *par_name)
Definition parselect.c:219
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
Definition proginfo.c:47
int tpcHtmlUsage(const char *program, char *text[], const char *path)
Definition proginfo.c:169
void tpcPrintBuild(const char *program, FILE *fp)
Definition proginfo.c:339
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
Definition proginfo.c:114
void icmparcFree(ICMPARC *d)
Definition simblood.c:125
void icmparcInit(ICMPARC *d)
Definition simblood.c:20
void statusInit(TPCSTATUS *s)
Definition statusmsg.c:104
char * errorMsg(tpcerror e)
Definition statusmsg.c:68
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
Definition statusmsg.c:142
size_t strlcpy(char *dst, const char *src, size_t dstsize)
Definition stringext.c:632
double Tdur
Definition tpccm.h:195
double Ti
Definition tpccm.h:193
double k_BV_BA
Definition tpccm.h:199
double Irate
Definition tpccm.h:197
Definition tpcpar.h:100
int parNr
Definition tpcpar.h:108
int tacNr
Definition tpcpar.h:104
PARR * r
Definition tpcpar.h:114
PARN * n
Definition tpcpar.h:112
int unit
Definition tpcpar.h:86
char name[MAX_PARNAME_LEN+1]
Definition tpcpar.h:82
char name[MAX_TACNAME_LEN+1]
Definition tpcpar.h:50
unsigned int model
Definition tpcpar.h:48
double * p
Definition tpcpar.h:64
double * y
Definition tpctac.h:75
Definition tpctac.h:87
double * x
Definition tpctac.h:97
tacformat format
Definition tpctac.h:93
int _sampleNr
Definition tpctac.h:121
int sampleNr
Definition tpctac.h:89
int isframe
Definition tpctac.h:95
TACC * c
Definition tpctac.h:117
double * x2
Definition tpctac.h:101
unit tunit
Definition tpctac.h:109
double * x1
Definition tpctac.h:99
int tacNr
Definition tpctac.h:91
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
void tacFree(TAC *tac)
Definition tac.c:106
int tacAllocate(TAC *tac, int sampleNr, int tacNr)
Definition tac.c:130
void tacInit(TAC *tac)
Definition tac.c:24
int tacWrite(TAC *tac, FILE *fp, tacformat format, int extra, TPCSTATUS *status)
Definition tacio.c:332
Header file for libtpccm.
Header file for library libtpcextensions.
@ UNIT_MIN
minutes
@ UNIT_PER_SEC
1/s
@ UNIT_SEC
seconds
@ UNIT_SEC_KBQ_PER_ML
s*kBq/mL
@ UNIT_PER_MIN
1/min
@ TPCERROR_OK
No error.
double unitConversionFactor(const int u1, const int u2)
Definition units.c:487
Header file for library libtpcift.
Header file for libtpcli.
Header file for libtpcpar.
@ PAR_FORMAT_TSV_UK
UK TSV (point as decimal separator).
Definition tpcpar.h:35
Header file for library libtpctac.
@ TAC_FORMAT_UNKNOWN
Unknown format.
Definition tpctac.h:28
@ TAC_FORMAT_PMOD
PMOD TAC format.
Definition tpctac.h:33
Header file for libtpctacmod.