TPCCLIB
Loading...
Searching...
No Matches
tacsa.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 "tpcpar.h"
20#include "tpcli.h"
21#include "tpcbfm.h"
22#include "tpctacmod.h"
23#include "tpclinopt.h"
24/*****************************************************************************/
25
26/*****************************************************************************/
27static char *info[] = {
28 "Compartmental model based spectral analysis of regional PET data.",
29 "Basis functions (from 1 to n) are formed with a range of k2 from zero to",
30 "a given maximum, with the provided PTAC as input function.",
31 "Model Croi(t) = Vb*Cb(t) + Ct[1](t) + Ct[2](t) + ... + Ct[n](t)",
32 "is fitted to the provided TTACs.",
33 " ",
34 " ____ _________ ",
35 " | |--K1[i=1]->| Ct[i=1] | ",
36 " | |<-k2[i=1]--|_________| ",
37 " | Cp | ....... ",
38 " | | _________ ",
39 " | |--K1[i=n]->| Ct[i=n] | ",
40 " | |<-k2[i=n]--|_________| ",
41 " |____| ",
42 " ",
43 "Croi = Vb*Cb + K1[i=1]*Ct[i=1] + ... K1[i=n]*Ct[i=n]",
44 " ",
45 "Usage: @P [options] ptacfile btacfile ttacfile maxk2 parfile [safile]",
46 " ",
47 "Options:",
48 " -n=<Number of basis functions>",
49 " Set the number of basis functions; by default 100, minimum 10.",
50 " -mink2=<Value>",
51 " Set minimum value for k2 in units 1/min; by default 0.005 min-1.",
52 " Do not set to zero or very low value, but if you want to add basis",
53 " function with k2=0 (trapping compartment), enter minimum k2 as",
54 " negative value.",
55 " -bf=<filename>",
56 " Basis function curves are written in specified file.",
57 " -fit=<Filename>",
58 " Fitted regional TTACs are written in specified file.",
59 " -stdoptions", // List standard options like --help, -v, etc
60 " ",
61 "Parameters Vb and K1 will be written in parameter file as the weights",
62 "of the basis functions (Vb as the weight of BTAC, and K1 as the sum of",
63 "weights of other basis functions), and k2 as the weighted average of",
64 "k2-derived basis functions.",
65 "In the optional SA file, the weights for each k2-derived basis functions",
66 "are listed in TAC format.",
67 " ",
68 "See also: fitdelay, bfmh2o, lhsol, hist2svg",
69 " ",
70 "Keywords: TAC, modelling, compartmental model, LLSQ",
71 0};
72/*****************************************************************************/
73
74/*****************************************************************************/
75/* Turn on the globbing of the command line, since it is disabled by default in
76 mingw-w64 (_dowildcard=0); in MinGW32 define _CRT_glob instead, if necessary;
77 In Unix&Linux wildcard command line processing is enabled by default. */
78/*
79#undef _CRT_glob
80#define _CRT_glob -1
81*/
82int _dowildcard = -1;
83/*****************************************************************************/
84
85/*****************************************************************************/
89int main(int argc, char **argv)
90{
91 int ai, help=0, version=0, verbose=1;
92 char ptacfile[FILENAME_MAX], btacfile[FILENAME_MAX], ttacfile[FILENAME_MAX],
93 bffile[FILENAME_MAX], parfile[FILENAME_MAX], safile[FILENAME_MAX], fitfile[FILENAME_MAX];
94 double k2max=nan("");
95 double k2min=0.005;
96 int bfNr=100;
97
98 /*
99 * Get arguments
100 */
101 if(argc==1) {tpcPrintUsage(argv[0], info, stderr); return(1);}
102 ptacfile[0]=btacfile[0]=ttacfile[0]=bffile[0]=parfile[0]=safile[0]=fitfile[0]=(char)0;
103 /* Options */
104 for(ai=1; ai<argc; ai++) if(*argv[ai]=='-') {
105 if(tpcProcessStdOptions(argv[ai], &help, &version, &verbose)==0) continue;
106 char *cptr=argv[ai]+1; if(*cptr=='-') cptr++; if(!*cptr) continue;
107 if(strncasecmp(cptr, "BF=", 3)==0) {
108 strlcpy(bffile, cptr+3, FILENAME_MAX); if(strlen(bffile)>0) continue;
109 } else if(strncasecmp(cptr, "FIT=", 4)==0) {
110 strlcpy(fitfile, cptr+4, FILENAME_MAX); if(strlen(fitfile)>0) continue;
111 } else if(strncasecmp(cptr, "N=", 2)==0) {
112 if(atoiCheck(cptr+2, &bfNr)==0 && bfNr>=10) continue;
113 } else if(strncasecmp(cptr, "NR=", 3)==0) {
114 if(atoiCheck(cptr+3, &bfNr)==0 && bfNr>=10) continue;
115 } else if(strncasecmp(cptr, "MINK2=", 6)==0) {
116 if(atofCheck(cptr+6, &k2min)==0 && fabs(k2min)>=1.0E-04) continue;
117 }
118 fprintf(stderr, "Error: invalid option '%s'.\n", argv[ai]);
119 return(1);
120 } else break;
121
122 TPCSTATUS status; statusInit(&status);
123 statusSet(&status, __func__, __FILE__, __LINE__, TPCERROR_OK);
124 status.verbose=verbose-3;
125
126 /* Print help or version? */
127 if(help==2) {tpcHtmlUsage(argv[0], info, ""); return(0);}
128 if(help) {tpcPrintUsage(argv[0], info, stdout); return(0);}
129 if(version) {tpcPrintBuild(argv[0], stdout); return(0);}
130
131 /* Process other arguments, starting from the first non-option */
132 if(ai<argc) strlcpy(ptacfile, argv[ai++], FILENAME_MAX);
133 if(ai<argc) strlcpy(btacfile, argv[ai++], FILENAME_MAX);
134 if(ai<argc) strlcpy(ttacfile, argv[ai++], FILENAME_MAX);
135 if(ai<argc) {
136 if(atofCheck(argv[ai], &k2max) || !(k2max>1.0E-03)) {
137 fprintf(stderr, "Error: invalid k2 maximum '%s'.\n", argv[ai]); return(1);}
138 ai++;
139 }
140 if(ai<argc) strlcpy(parfile, argv[ai++], FILENAME_MAX);
141 if(ai<argc) strlcpy(safile, argv[ai++], FILENAME_MAX);
142 if(ai<argc) {
143 fprintf(stderr, "Error: invalid argument '%s'.\n", argv[ai]);
144 return(1);
145 }
146 /* Did we get all the information that we need? */
147 if(!parfile[0]) {
148 fprintf(stderr, "Error: missing command-line argument; use option --help\n");
149 return(1);
150 }
151
152
153 /* In verbose mode print arguments and options */
154 if(verbose>1) {
155 printf("ptacfile := %s\n", ptacfile);
156 printf("btacfile := %s\n", btacfile);
157 printf("ttacfile := %s\n", ttacfile);
158 printf("parfile := %s\n", parfile);
159 if(safile[0]) printf("safile := %s\n", safile);
160 if(bffile[0]) printf("bffile := %s\n", bffile);
161 if(fitfile[0]) printf("fitfile := %s\n", fitfile);
162 printf("k2max := %g\n", k2max);
163 printf("k2min := %g\n", k2min);
164 printf("n := %d\n", bfNr);
165 }
166
167
168 /*
169 * Read tissue and input data
170 */
171 if(verbose>1) printf("reading tissue and input data\n");
172 statusSet(&status, __func__, __FILE__, __LINE__, TPCERROR_OK);
173 double fitdur=1.0E+10;
174 TAC ttac, itac; tacInit(&ttac); tacInit(&itac);
175 tacReadModelingData(ttacfile, ptacfile, btacfile, NULL, &fitdur, 0, NULL, &ttac, &itac, &status);
176 if(status.error!=TPCERROR_OK) {
177 fprintf(stderr, "Error: %s\n", errorMsg(status.error));
178 tacFree(&ttac); tacFree(&itac); return(2);
179 }
180 if(verbose>2) {
181 printf("fileformat := %s\n", tacFormattxt(ttac.format));
182 printf("tacNr := %d\n", ttac.tacNr);
183 printf("ttac.sampleNr := %d\n", ttac.sampleNr);
184 printf("itac.sampleNr := %d\n", itac.sampleNr);
185 printf("xunit := %s\n", unitName(ttac.tunit));
186 printf("yunit := %s\n", unitName(ttac.cunit));
187 printf("fitdur := %g s\n", fitdur);
188 }
189 if(ttac.sampleNr<5 || itac.sampleNr<5) {
190 fprintf(stderr, "Error: too few data samples.\n");
191 tacFree(&ttac); tacFree(&itac); return(2);
192 }
193 /* Set frame mid times */
194 if(ttac.isframe) tacSetX(&ttac, NULL);
195 if(itac.isframe) tacSetX(&itac, NULL);
196 /* Frame times are in minutes, and k2 limits were requested in units 1/min,
197 so no need to convert k2min or k2max. */
198
199
200 /* Interpolate BTAC to TTAC sample times; needed for Va correction */
201 if(verbose>1) printf("interpolating BTAC to TTAC sample times\n");
202 TAC tbtac; tacInit(&tbtac);
203 tacInterpolate(&itac, &ttac, &tbtac, NULL, NULL, &status);
204 if(status.error!=TPCERROR_OK) {
205 fprintf(stderr, "Error: %s\n", errorMsg(status.error));
206 tacFree(&ttac); tacFree(&itac); return(2);
207 }
208
209
210 /*
211 * Calculate the basis functions
212 */
213 if(verbose>1) printf("calculating basis functions\n");
214 TAC bf; tacInit(&bf);
215 bfm1TCM(&itac, &ttac, bfNr, -k2min, k2max, 1, &bf, &status);
216 if(status.error!=TPCERROR_OK) {
217 if(verbose>1) fprintf(stderr, "Error: cannot calculate basis functions.\n");
218 fprintf(stderr, "Error: %s\n", errorMsg(status.error));
219 tacFree(&ttac); tacFree(&itac); tacFree(&tbtac); return(3);
220 }
221 if(verbose>2 && bfNr<=20) {
222 printf("\nBF k2 values:\n");
223 for(int i=0; i<bf.tacNr; i++) printf("\t%d\t%g\n", 1+i, bf.c[i].size);
224 }
225 /* Save basis functions if required */
226 if(bffile[0]) {
227 if(verbose>1) printf("writing %s\n", bffile);
228 FILE *fp; fp=fopen(bffile, "w");
229 if(fp==NULL) {
230 fprintf(stderr, "Error: cannot open file for writing (%s)\n", bffile);
231 tacFree(&ttac); tacFree(&itac); tacFree(&tbtac); tacFree(&bf);
232 return(3);
233 }
234 tacWrite(&bf, fp, TAC_FORMAT_PMOD, 1, &status);
235 fclose(fp);
236 if(status.error) {
237 fprintf(stderr, "Error: %s\n", errorMsg(status.error));
238 tacFree(&ttac); tacFree(&itac); tacFree(&tbtac); tacFree(&bf);
239 return(3);
240 }
241 if(verbose>0) {printf("basis functions saved in %s.\n", bffile); fflush(stdout);}
242 }
243
244
245 /*
246 * Prepare the room for parameter result
247 */
248 if(verbose>1) {printf("initializing result data\n"); fflush(stdout);}
249 PAR par; parInit(&par);
250 parAllocateWithTAC(&par, &ttac, 3, &status);
251 if(status.error!=TPCERROR_OK) {
252 fprintf(stderr, "Error: %s\n", errorMsg(status.error));
253 tacFree(&ttac); tacFree(&itac); tacFree(&tbtac); tacFree(&bf);
254 return(4);
255 }
256 /* Copy titles & filenames */
257 {
258 int i;
259 char buf[256];
260 time_t t=time(NULL);
261 /* set program name */
262 tpcProgramName(argv[0], 1, 1, buf, 256);
263 iftPut(&par.h, "program", buf, 0, NULL);
264 /* set file names */
265 iftPut(&par.h, "plasmafile", ptacfile, 0, NULL);
266 iftPut(&par.h, "bloodfile", btacfile, 0, NULL);
267 iftPut(&par.h, "datafile", ttacfile, 0, NULL);
268 /* Fit method */
269 iftPut(&par.h, "fitmethod", "NNLS", 0, NULL);
270 /* Set current time to results */
271 iftPut(&par.h, "analysis_time", ctime_r_int(&t, buf), 0, NULL);
272 /* Set fit times for each TAC */
273 for(i=0; i<par.tacNr; i++) {
274 par.r[i].dataNr=ttac.sampleNr;
275 par.r[i].start=0.0;
276 par.r[i].end=fitdur;
277 /* and nr of fitted parameters */
278 par.r[i].fitNr=3;
279 }
280 /* Set the parameter names and units */
281 i=0; strcpy(par.n[i].name, "K1"); par.n[i].unit=UNIT_ML_PER_ML_MIN;
282 i++; strcpy(par.n[i].name, "k2"); par.n[i].unit=UNIT_PER_MIN;
283 i++; strcpy(par.n[i].name, "Vb"); par.n[i].unit=UNIT_ML_PER_ML;
284 }
285
286
287 /*
288 * Allocate memory for regional SA results
289 */
290 if(verbose>1) {printf("allocating memory for SA results\n"); fflush(stdout);}
291 TAC sa; tacInit(&sa);
292 {
293 if(tacDuplicate(&ttac, &sa)) {
294 fprintf(stderr, "Error: cannot allocate memory for SA results.\n");
295 tacFree(&ttac); tacFree(&itac); tacFree(&tbtac); tacFree(&bf); parFree(&par);
296 return(6);
297 }
298 if(tacAllocateMoreSamples(&sa, bfNr-sa.sampleNr)) {
299 fprintf(stderr, "Error: cannot allocate memory for SA results.\n");
300 tacFree(&ttac); tacFree(&itac); tacFree(&tbtac); tacFree(&bf); parFree(&par); tacFree(&sa);
301 return(6);
302 }
303 sa.sampleNr=bfNr; sa.isframe=0; sa.cunit=sa.tunit=UNIT_UNKNOWN;
304 for(int i=0; i<bfNr; i++) sa.x[i]=bf.c[i].size;
305 }
306
307 /*
308 * Allocate memory for fitted TTACs, if requested
309 */
310 TAC ftac; tacInit(&ftac);
311 if(fitfile[0]) {
312 if(verbose>1) {printf("allocating memory for fitted TTACs\n"); fflush(stdout);}
313 if(tacDuplicate(&ttac, &ftac)) {
314 fprintf(stderr, "Error: cannot allocate memory for fitted TTACs.\n");
315 tacFree(&ttac); tacFree(&itac); tacFree(&tbtac); tacFree(&bf); parFree(&par); tacFree(&sa);
316 return(6);
317 }
318 }
319
320
321 /*
322 * Allocate memory required by NNLS
323 */
324 if(verbose>1) {printf("allocating memory for NNLS\n"); fflush(stdout);}
325 int llsq_m=ttac.sampleNr;
326 int llsq_n=1+bf.tacNr; // Including Vb as the first column and parameter
327 double *llsq_mat=(double*)malloc((2*llsq_n*llsq_m)*sizeof(double));
328 if(llsq_mat==NULL) {
329 fprintf(stderr, "Error: cannot allocate memory for NNLS.\n");
330 tacFree(&ttac); tacFree(&itac); tacFree(&tbtac); tacFree(&bf); parFree(&par); tacFree(&sa); tacFree(&ftac);
331 return(7);
332 }
333 double **llsq_a=(double**)malloc(llsq_n*sizeof(double*));
334 if(llsq_a==NULL) {
335 fprintf(stderr, "Error: cannot allocate memory for NNLS.\n");
336 fprintf(stderr, "Error: cannot allocate memory for NNLS.\n");
337 tacFree(&ttac); tacFree(&itac); tacFree(&tbtac); tacFree(&bf); parFree(&par); tacFree(&sa); tacFree(&ftac);
338 free(llsq_mat);
339 return(7);
340 }
341 for(int ni=0; ni<llsq_n; ni++) llsq_a[ni]=llsq_mat+ni*llsq_m;
342 double r2, llsq_b[llsq_m], llsq_x[llsq_n], llsq_wp[llsq_n], llsq_zz[llsq_m];
343 int indexp[llsq_n];
344 double *matbackup=llsq_mat+llsq_n*llsq_m;
345
346 /*
347 * Fit each regional TTAC
348 */
349 for(int ti=0; ti<ttac.tacNr; ti++) {
350
351 if(verbose>1 && ttac.tacNr>1) {
352 printf("Region %d %s\n", 1+ti, ttac.c[ti].name); fflush(stdout);}
353
354 /* Setup data matrix A and vector B */
355 for(int mi=0; mi<llsq_m; mi++)
356 llsq_b[mi]=ttac.c[ti].y[mi]; // Measure TTAC into B vector
357 for(int mi=0; mi<llsq_m; mi++)
358 llsq_mat[mi]=tbtac.c[1].y[mi]; // Interpolated BTAC into first A column
359 for(int bi=0; bi<bf.tacNr; bi++)
360 for(int mi=0; mi<llsq_m; mi++) // Basis functions into next A columns
361 llsq_mat[mi+(1+bi)*llsq_m]=bf.c[bi].y[mi];
362 /* Make a copy of A matrix for later use */
363 for(int i=0; i<llsq_n*llsq_m; i++) matbackup[i]=llsq_mat[i];
364 /* Compute NNLS */
365 if(verbose>3) printf("starting NNLS...\n");
366 int ret=nnls(llsq_a, llsq_m, llsq_n, llsq_b, llsq_x, &r2, llsq_wp, llsq_zz, indexp);
367 if(verbose>3) printf(" ... done.\n");
368 if(ret>1) {
369 fprintf(stderr, "Warning: no NNLS solution for %s\n", ttac.c[ti].name);
370 for(int ni=0; ni<llsq_n; ni++) llsq_x[ni]=0.0;
371 r2=0.0;
372 } else if(ret>0) {
373 fprintf(stderr, "Warning: maximum iterations reached for %s\n", ttac.c[ti].name);
374 }
375 /* Copy SA weights, excluding weight for BTAC */
376 for(int ni=1; ni<llsq_n; ni++) sa.c[ti].y[ni-1]=llsq_x[ni];
377 /* Copy results */
378 par.r[ti].p[2]=llsq_x[0]; // Vb
379 par.r[ti].p[0]=0.0; // K1
380 for(int i=0; i<sa.sampleNr; i++) par.r[ti].p[0]+=sa.c[ti].y[i];
381 par.r[ti].p[1]=0.0; // k2
382 for(int i=0; i<sa.sampleNr; i++) par.r[ti].p[1]+=sa.c[ti].y[i]*bf.c[i].size;
383 if(par.r[ti].p[0]>1.0E-06) par.r[ti].p[1]/=par.r[ti].p[0];
384 par.r[ti].wss=r2; // r2
385 /* Calculate fitted TTAC, if needed */
386 if(fitfile[0]) {
387 for(int mi=0; mi<llsq_m; mi++) {
388 ftac.c[ti].y[mi]=0.0;
389 for(int ni=0; ni<llsq_n; ni++) ftac.c[ti].y[mi]+=llsq_x[ni]*matbackup[mi+ni*llsq_m];
390 }
391 }
392 }
393 free(llsq_a); free(llsq_mat);
394
395 /*
396 * Print results on screen and/or save in file
397 */
398 par.format=parFormatFromExtension(parfile);
399 if(verbose>2) printf("result file format := %s\n", parFormattxt(par.format));
401 /* On screen */
402 if(verbose>0 && par.tacNr<50) parWrite(&par, stdout, PAR_FORMAT_UNKNOWN, 0, &status);
403 /* Save results */
404 if(parfile[0]) {
405 if(verbose>1) printf("writing %s\n", parfile);
406 FILE *fp; fp=fopen(parfile, "w");
407 if(fp==NULL) {
408 fprintf(stderr, "Error: cannot open file for writing (%s)\n", parfile);
409 tacFree(&ttac); tacFree(&itac); tacFree(&tbtac); tacFree(&bf); parFree(&par); tacFree(&sa); tacFree(&ftac);
410 return(11);
411 }
412 int ret=parWrite(&par, fp, PAR_FORMAT_UNKNOWN, 1, &status);
413 fclose(fp);
414 //parFree(&par);
415 if(ret!=TPCERROR_OK) {
416 fprintf(stderr, "Error: %s\n", errorMsg(status.error));
417 tacFree(&ttac); tacFree(&itac); tacFree(&tbtac); tacFree(&bf); parFree(&par); tacFree(&sa); tacFree(&ftac);
418 return(12);
419 }
420 if(verbose>0) printf("Results saved in %s.\n", parfile);
421 }
422
423
424 /*
425 * Save SA results (weights for each k2)
426 */
427 if(safile[0]) {
428 if(verbose>1) printf("writing %s\n", safile);
429 FILE *fp; fp=fopen(safile, "w");
430 if(fp==NULL) {
431 fprintf(stderr, "Error: cannot open file for writing (%s)\n", safile);
432 tacFree(&ttac); tacFree(&itac); tacFree(&tbtac); tacFree(&bf); parFree(&par); tacFree(&sa); tacFree(&ftac);
433 return(12);
434 }
435 int ret=tacWrite(&sa, fp, TAC_FORMAT_PMOD, 1, &status);
436 fclose(fp);
437 if(ret!=TPCERROR_OK) {
438 fprintf(stderr, "Error: %s\n", errorMsg(status.error));
439 tacFree(&ttac); tacFree(&itac); tacFree(&tbtac); tacFree(&bf); parFree(&par); tacFree(&sa); tacFree(&ftac);
440 return(12);
441 }
442 if(verbose>0) printf("SA results written in %s.\n", safile);
443 }
444
445
446 /*
447 * Save fitted TTACs, if requested
448 */
449 if(fitfile[0]) {
450 if(verbose>1) printf("writing %s\n", fitfile);
451 int ret;
452 FILE *fp; fp=fopen(fitfile, "w");
453 if(fp==NULL) {
454 fprintf(stderr, "Error: cannot open file for writing fitted TTACs.\n");
455 ret=TPCERROR_FAIL;
456 } else {
457 ret=tacWrite(&ftac, fp, TAC_FORMAT_UNKNOWN, 1, &status);
458 fclose(fp);
459 if(ret!=TPCERROR_OK) fprintf(stderr, "Error: %s\n", errorMsg(status.error));
460 }
461 if(ret!=TPCERROR_OK) {
462 tacFree(&ttac); tacFree(&itac); tacFree(&tbtac); tacFree(&bf); parFree(&par); tacFree(&sa); tacFree(&ftac);
463 return(13);
464 }
465 if(verbose>0) printf("fitted TACs saved in %s.\n", fitfile);
466 }
467
468
469 tacFree(&ttac); tacFree(&itac); tacFree(&tbtac); tacFree(&bf); parFree(&par); tacFree(&sa); tacFree(&ftac);
470 return(0);
471}
472/*****************************************************************************/
473
474/*****************************************************************************/
int bfm1TCM(TAC *input, TAC *tissue, int bfNr, const double k2min, const double k2max, const int distr, TAC *bf, TPCSTATUS *status)
Definition bf_1tcm.c:27
char * ctime_r_int(const time_t *t, char *buf)
Convert calendar time t into a null-terminated string of the form YYYY-MM-DD hh:mm:ss,...
Definition datetime.c:119
int atofCheck(const char *s, double *v)
Definition decpoint.c:94
int iftPut(IFT *ift, const char *key, const char *value, char comment, TPCSTATUS *status)
Definition ift.c:63
int atoiCheck(const char *s, int *v)
Definition intutil.c:25
int tacInterpolate(TAC *inp, TAC *xinp, TAC *tac, TAC *itac, TAC *iitac, TPCSTATUS *status)
Interpolate and/or integrate TACs from one TAC structure into a new TAC structure,...
Definition litac.c:141
int nnls(double **a, int m, int n, double *b, double *x, double *rnorm, double *wp, double *zzp, int *indexp)
Definition nnls.c:43
void parFree(PAR *par)
Definition par.c:75
void parInit(PAR *par)
Definition par.c:25
char * parFormattxt(parformat c)
Definition pario.c:59
int parWrite(PAR *par, FILE *fp, parformat format, int extra, TPCSTATUS *status)
Definition pario.c:148
int parFormatFromExtension(const char *s)
Definition pario.c:102
int parAllocateWithTAC(PAR *par, TAC *tac, int parNr, TPCSTATUS *status)
Allocate PAR based on data in TAC.
Definition partac.c:90
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
Definition proginfo.c:47
void tpcProgramName(const char *program, int version, int copyright, char *prname, int n)
Definition proginfo.c:406
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 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
Definition tpcpar.h:100
int format
Definition tpcpar.h:102
IFT h
Optional (but often useful) header information.
Definition tpcpar.h:147
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
double wss
Definition tpcpar.h:72
int fitNr
Definition tpcpar.h:58
int dataNr
Definition tpcpar.h:62
double * p
Definition tpcpar.h:64
double start
Definition tpcpar.h:52
double end
Definition tpcpar.h:54
char name[MAX_TACNAME_LEN+1]
Definition tpctac.h:81
double * y
Definition tpctac.h:75
double size
Definition tpctac.h:71
Definition tpctac.h:87
double * x
Definition tpctac.h:97
unit cunit
Definition tpctac.h:105
tacformat format
Definition tpctac.h:93
int sampleNr
Definition tpctac.h:89
int isframe
Definition tpctac.h:95
TACC * c
Definition tpctac.h:117
unit tunit
Definition tpctac.h:109
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 tacDuplicate(TAC *tac1, TAC *tac2)
Make a duplicate of TAC structure.
Definition tac.c:356
void tacInit(TAC *tac)
Definition tac.c:24
int tacAllocateMoreSamples(TAC *tac, int addNr)
Allocate memory for more samples in TAC data.
Definition tac.c:435
char * tacFormattxt(tacformat c)
Definition tacio.c:98
int tacWrite(TAC *tac, FILE *fp, tacformat format, int extra, TPCSTATUS *status)
Definition tacio.c:332
int tacReadModelingData(const char *tissuefile, const char *inputfile1, const char *inputfile2, const char *inputfile3, double *fitdur, int cutInput, int *fitSampleNr, TAC *tis, TAC *inp, TPCSTATUS *status)
Read tissue and input data for modelling.
int tacSetX(TAC *d, TPCSTATUS *status)
Set TAC x values based on x1 and x2 values, or guess x1 and x2 values based on x values.
Definition tacx.c:653
Header file for libtpcbfm.
Header file for library libtpcextensions.
@ UNIT_ML_PER_ML
mL/mL
@ UNIT_ML_PER_ML_MIN
mL/(mL*min)
@ UNIT_UNKNOWN
Unknown unit.
@ UNIT_PER_MIN
1/min
@ TPCERROR_FAIL
General error.
@ TPCERROR_OK
No error.
char * unitName(int unit_code)
Definition units.c:143
Header file for library libtpcift.
Header file for libtpcli.
Header file for libtpclinopt.
Header file for libtpcpar.
@ PAR_FORMAT_UNKNOWN
Unknown format.
Definition tpcpar.h:28
@ 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.