13int dftQSortName(
const void *voi1,
const void *voi2);
14int dftQSortPlane(
const void *voi1,
const void *voi2);
24 if(data==NULL)
return;
25 if(data->_voidataNr>0) free((
char*)(data->
voi));
26 if(data->_dataSize>0) free((
char*)(data->_data));
27 data->_dataSize=data->_voidataNr=0;
42 if(data==NULL)
return;
43 memset(data, 0,
sizeof(
DFT));
44 data->_voidataNr=data->_dataSize=0;
69 if(data==NULL)
return 1;
74 data->
voi=(
Voi*)calloc(voiNr,
sizeof(
Voi));
75 if(data->
voi==NULL)
return 1;
76 data->_voidataNr=voiNr;
81 n=(frameNr+1)*(3+1+3*voiNr);
82 data->_data=(
double*)calloc(n,
sizeof(
double));
83 if(data->_data==NULL)
return 1;
87 d=data->_data; data->
x = d;
88 d += frameNr + 1; data->
x1 = d;
89 d += frameNr + 1; data->
x2 = d;
90 d += frameNr + 1; data->
w = d;
91 for(i=0; i<voiNr; i++) {
92 d += frameNr + 1; data->
voi[i].
y = d;
93 d += frameNr + 1; data->
voi[i].
y2 = d;
94 d += frameNr + 1; data->
voi[i].
y3 = d;
114 double *data2, *dptr, *newx, *newx1, *newx2, *neww;
115 int ri, fi, dataSize2, voidataNr2;
118 if(dft==NULL || dft->
voi==NULL || dft->
frameNr<1 || dft->
voiNr<1)
return 1;
119 if(voiNr<0)
return 1;
else if(voiNr==0)
return 0;
122 voidataNr2=voiNr+dft->_voidataNr;
123 voi2=(
Voi*)calloc(voidataNr2,
sizeof(
Voi));
124 if(voi2==NULL)
return 3;
125 dataSize2=(dft->
frameNr+1)*(3*voidataNr2+4);
126 data2=(
double*)calloc(dataSize2,
sizeof(
double));
if(data2==NULL)
return 3;
128 dptr=data2; newx=dptr; newx[dft->
frameNr]=0.0;
132 for(ri=0; ri<voidataNr2; ri++) {
133 dptr+=dft->
frameNr+1; voi2[ri].
y = dptr;
134 dptr+=dft->
frameNr+1; voi2[ri].
y2 = dptr;
135 dptr+=dft->
frameNr+1; voi2[ri].
y3 = dptr;
139 for(ri=0; ri<dft->
voiNr; ri++) {
141 strcpy(voi2[ri].name, dft->
voi[ri].
name);
142 strcpy(voi2[ri].voiname, dft->
voi[ri].
voiname);
144 strcpy(voi2[ri].place, dft->
voi[ri].
place);
150 for(fi=0; fi<dft->
frameNr; fi++) {
151 voi2[ri].
y[fi]=dft->
voi[ri].
y[fi];
152 voi2[ri].
y2[fi]=dft->
voi[ri].
y2[fi];
153 voi2[ri].
y3[fi]=dft->
voi[ri].
y3[fi];
156 for(fi=0; fi<dft->
frameNr; fi++) {
157 newx[fi]=dft->
x[fi]; newx1[fi]=dft->
x1[fi]; newx2[fi]=dft->
x2[fi];
162 free(dft->_data); dft->_data=data2;
163 free(dft->
voi); dft->
voi=voi2;
164 dft->
x=newx; dft->
x1=newx1; dft->
x2=newx2; dft->
w=neww;
165 dft->_voidataNr=voidataNr2; dft->_dataSize=dataSize2;
168 for(ri=dft->
voiNr; ri<dft->_voidataNr; ri++) {
175 for(fi=0; fi<dft->
frameNr+1; fi++)
198 if(data1==NULL || data2==NULL)
return 1;
200 if(data2->
voiNr<=voi || voi<0) {
201 strcpy(
dfterrmsg,
"there is no region to combine");
return 8;}
208 strcpy(
dfterrmsg,
"data does not match");
return 8;}
211 if(data1->_voidataNr==data1->
voiNr)
213 strcpy(
dfterrmsg,
"cannot allocate memory");
return 8;}
218 for(i=0; i<data1->
frameNr; i++) {
219 data1->
voi[n].
y[i]=data2->
voi[voi].
y[i];
227 for(i=0; i<data1->
frameNr; i++) data1->
w[i]=data2->
w[i];
245 unsigned int i, j, n;
246 char *p, n1[128], n2[128], n3[128], tmp[128], sname[1024];
248 if(data==NULL)
return -1;
250 if(name==NULL || strlen(name)==0) {
251 for(i=0; i<(
unsigned int)data->
voiNr; i++) data->
voi[i].
sw=1;
257 n1[0]=n2[0]=n3[0]=(char)0;
258 p=strtok(sname,
" ,;\n\t|");
if(p!=NULL) strcpy(n1, p);
else return -1;
259 p=strtok(NULL,
" ,;\n\t|");
if(p!=NULL) {
260 strcpy(n2, p); p=strtok(NULL,
" ,;\n\t|");
if(p!=NULL) strcpy(n3, p);}
262 for(i=0; i<strlen(n1); i++) n1[i]=tolower(n1[i]);
263 for(i=0; i<strlen(n2); i++) n2[i]=tolower(n2[i]);
264 for(i=0; i<strlen(n3); i++) n3[i]=tolower(n3[i]);
266 for(i=0, n=0; i<(
unsigned int)data->
voiNr; i++) {
270 for(j=0; j<strlen(tmp); j++) tmp[j]=tolower(tmp[j]);
271 if(strstr(tmp, n1)==NULL)
continue;
272 if(n2[0] && strstr(tmp, n2)==NULL)
continue;
273 if(n3[0] && strstr(tmp, n3)==NULL)
continue;
274 data->
voi[i].
sw=1; n++;
296 if(dft==NULL || dft->
voiNr<1 || strlen(region_name)<1)
return(-1);
298 if(reset!=0)
for(ri=0; ri<dft->
voiNr; ri++) dft->
voi[ri].
sw=0;
300 for(ri=0; ri<dft->
voiNr; ri++) {
302 dft->
voi[ri].
sw=1; match_nr++;
318 int ri, len, min_len, i;
320 if(dft==NULL || dft->
voiNr<1)
return -1;
321 for(ri=0, i=-1, min_len=9999; ri<dft->
voiNr; ri++)
if(dft->
voi[ri].
sw) {
327 if(strcmp(dft->
voi[ri].
place,
".")!=0 &&
328 strcasecmp(dft->
voi[ri].
place,
"ALL")!=0 &&
329 strcasecmp(dft->
voi[ri].
place,
"AVG")!=0 &&
330 strcasecmp(dft->
voi[ri].
place,
"MEAN")!=0)
332 if(len<min_len) {min_len=len; i=ri;}
334 if(i<0)
return -2;
else return i;
347 if(data==NULL)
return;
351 for(i=j=0; i<data->
frameNr; i++) {
352 fs=data->
x2[i]-data->
x1[i];
if(fs>1.0E-10) {j=1;
break;}
355 for(i=0; i<data->
frameNr; i++) data->
x[i]=0.5*(data->
x1[i]+data->
x2[i]);
365 if(data->
x[0]<=0.0) {data->
x1[0]=data->
x[0]; data->
x2[0]=0.0;}
366 else {data->
x1[0]=0.0; data->
x2[0]=2.0*data->
x[0];}
370 for(i=0; i<data->
frameNr; i++) data->
x1[i]=data->
x2[i]=-999.;
372 for(i=1; i<data->
frameNr-1; i++) {
373 f=data->
x[i]-data->
x[i-1]; fs=data->
x[i+1]-data->
x[i];
374 if((f+fs)<=0.0 && fabs(fs-f)>=2.0)
continue;
375 if((f+fs)>0.0 && (2.0*fabs(fs-f)/(f+fs))>0.1)
continue;
378 data->
x1[i-1]=data->
x[i-1]-f/2.0; data->
x2[i-1]=data->
x[i-1]+f/2.0;
379 data->
x1[i]=data->
x[i]-f/2.0; data->
x2[i]=data->
x[i]+f/2.0;
380 data->
x1[i+1]=data->
x[i+1]-f/2.0; data->
x2[i+1]=data->
x[i+1]+f/2.0;
382 for(j=i-1; j<i+2; j++) {
383 if(data->
x1[j]<0.0) data->
x1[j]=0.0;
384 if(data->
x2[j]<0.0) data->
x2[j]=0.0;
390 if(data->
x1[i+1]>0) data->
x2[i]=data->
x1[i+1];
391 else data->
x2[i]=(data->
x[i+1]+data->
x[i])/2.0;
392 data->
x1[i]=2.0*data->
x[i]-data->
x2[i];
396 if(data->
x2[i-1]>0) data->
x1[i]=data->
x2[i-1];
397 else data->
x1[i]=(data->
x[i-1]+data->
x[i])/2.0;
398 data->
x2[i]=2.0*data->
x[i]-data->
x1[i];
401 for(i=1; i<data->
frameNr-1; i++)
if(data->
x1[i]<0.0) {
403 if(data->
x[i]-data->
x[i-1] <= data->
x[i+1]-data->
x[i]) {
404 if(data->
x2[i-1]>0) data->
x1[i]=data->
x2[i-1];
405 else data->
x1[i]=(data->
x[i-1]+data->
x[i])/2.0;
406 data->
x2[i]=2.*data->
x[i]-data->
x1[i];
408 if(data->
x1[i+1]>0) data->
x2[i]=data->
x1[i+1];
409 else data->
x2[i]=(data->
x[i+1]+data->
x[i])/2.0;
410 data->
x1[i]=2.0*data->
x[i]-data->
x2[i];
414 for(i=0; i<data->
frameNr; i++) {
415 if(data->
x1[i]<0.0) data->
x1[i]=0.0;
416 if(data->
x2[i]<0.0) data->
x2[i]=data->
x1[i];
419 for(i=1; i<data->
frameNr; i++) {
420 f=data->
x1[i]-data->
x2[i-1];
422 if(data->
x[i]>data->
x2[i-1]) data->
x1[i]=data->
x2[i-1];
423 else if(data->
x[i-1]<data->
x1[i]) data->
x2[i-1]=data->
x1[i];
424 else data->
x1[i]=data->
x2[i-1]=(data->
x[i]+data->
x[i-1])/2.0;
425 }
else if(f>0.0 && f<1.0) {
426 data->
x1[i]=data->
x2[i-1]=(data->
x1[i]+data->
x2[i-1])/2.0;
431 for(i=0; i<data->
frameNr; i++) data->
x[i]=0.5*(data->
x1[i]+data->
x2[i]);
434 for(i=0; i<data->
frameNr-1; i++) data->
x2[i]=data->
x1[i+1];
437 for(i=0; i<data->
frameNr; i++) data->
x[i]=0.5*(data->
x1[i]+data->
x2[i]);
441 for(i=1; i<data->
frameNr; i++) data->
x1[i]=data->
x2[i-1];
442 for(i=0; i<data->
frameNr; i++) data->
x[i]=0.5*(data->
x1[i]+data->
x2[i]);
457 if(data==NULL || data->
frameNr<1 || data->
voiNr<1)
return 0;
458 if(data->
x[data->
frameNr]!=0.0)
return 1;
459 if(data->
x1[data->
frameNr]!=0.0)
return 2;
460 if(data->
x2[data->
frameNr]!=0.0)
return 3;
461 for(i=0; i<data->
voiNr; i++) {
483 if(data==NULL || to>=data->_voidataNr || from>=data->_voidataNr)
return 1;
484 if(from==to)
return 0;
496 for(i=0; i<data->
frameNr; i++) {
497 data->
voi[to].
y[i]=data->
voi[from].
y[i];
520 if(dft==NULL || from<0 || to<0)
return(1);
521 if(from+1>dft->_voidataNr || to+1>dft->_voidataNr)
return(2);
522 if(from==to)
return(0);
524 memcpy(&voi, dft->
voi+from, voisize);
525 if(from>to)
for(ri=from; ri>to; ri--)
526 memcpy(dft->
voi+ri, dft->
voi+(ri-1), voisize);
527 else for(ri=from; ri<to; ri++)
528 memcpy(dft->
voi+ri, dft->
voi+(ri+1), voisize);
529 memcpy(dft->
voi+ri, &voi, voisize);
547 if(dft==NULL || voi>dft->
voiNr-1 || voi<0)
return(1);
549 if(voi==dft->
voiNr-1) {dft->
voiNr--;
return(0);}
567 if(dft1==NULL || dft2==NULL)
return 1;
595 if(dft1==NULL || dft2==NULL)
return 1;
596 if(ow || (strlen(dft2->
studynr)<1 && strcmp(dft2->
studynr,
".")==0))
598 if(ow || dftUnitId(dft2->
unit)==CUNIT_UNKNOWN)
600 if(ow || dft2->
timeunit==TUNIT_UNKNOWN)
605 if(ow || strlen(dft2->
isotope)<1)
634 if(dft1==NULL || dft2==NULL)
return 1;
635 if(to>=dft2->_voidataNr || from>=dft1->_voidataNr)
return 1;
664 if(dft1==NULL || dft2==NULL)
return 1;
676 for(ri=0; ri<dft1->
voiNr; ri++) {
678 for(fi=0; fi<dft1->
frameNr; fi++) {
679 dft2->
voi[ri].
y[fi]=dft1->
voi[ri].
y[fi];
684 for(fi=0; fi<dft1->
frameNr; fi++) {
685 dft2->
x[fi]=dft1->
x[fi];
686 dft2->
x1[fi]=dft1->
x1[fi]; dft2->
x2[fi]=dft1->
x2[fi];
687 dft2->
w[fi]=dft1->
w[fi];
716 if(dft==NULL || dft_from==NULL || frameNr<1 || voiNr<0)
return 1;
720 ret=
dftSetmem(dft, frameNr, voiNr);
if(ret)
return(ret);
725 for(ri=0; ri<dft->
voiNr; ri++) {
726 ret=
dftCopyvoihdr(dft_from, ri, dft, ri);
if(ret)
return(ret);
728 for(fi=0; fi<dft->
frameNr; fi++) {
729 dft->
voi[ri].
y[fi]=dft_from->
voi[ri].
y[fi];
737 for(fi=0; fi<dft->
frameNr; fi++) {
738 dft->
x[fi]=dft_from->
x[fi];
739 dft->
x1[fi]=dft_from->
x1[fi]; dft->
x2[fi]=dft_from->
x2[fi];
740 dft->
w[fi]=dft_from->
w[fi];
761 if(data==NULL)
return 1;
762 if(data->
frameNr<1 || data->
x[0]==0.0)
return 0;
775 for(j=0; j<data->
frameNr; j++) {
776 temp.
x[j]=data->
x[j]; temp.
x1[j]=data->
x1[j]; temp.
x2[j]=data->
x2[j];
777 temp.
w[j]=data->
w[j];
778 for(i=0; i<data->
voiNr; i++) {
784 for(i=0; i<data->
voiNr; i++) {
800 data->
x[0]=data->
x1[0]=data->
x2[0]=0.0; data->
w[0]=0.0;
801 for(i=0; i<temp.
voiNr; i++)
811 for(j=0, n=1; j<temp.
frameNr; j++) {
812 if(temp.
x[j]<0.0)
continue;
813 if(n==1) data->
x2[0]=temp.
x1[j];
814 data->
x[n]=temp.
x[j]; data->
x1[n]=temp.
x1[j]; data->
x2[n]=temp.
x2[j];
815 data->
w[n]=temp.
w[j];
816 for(i=0; i<temp.
voiNr; i++) {
824 for(i=0; i<temp.
voiNr; i++) {
849 if(data==NULL)
return(1);
850 if(data->
voiNr<=1)
return(0);
851 qsort(data->
voi, data->
voiNr,
sizeof(
Voi), dftQSortName);
855int dftQSortName(
const void *voi1,
const void *voi2)
859 res=strcasecmp( ((
Voi*)voi1)->name, ((
Voi*)voi2)->name );
860 if(res!=0)
return(res);
861 res=strcasecmp( ((
Voi*)voi1)->voiname, ((
Voi*)voi2)->voiname );
862 if(res!=0)
return(res);
863 res=strcasecmp( ((
Voi*)voi1)->hemisphere, ((
Voi*)voi2)->hemisphere );
864 if(res!=0)
return(res);
865 res=strcasecmp( ((
Voi*)voi1)->place, ((
Voi*)voi2)->place );
879 if(data==NULL)
return(1);
880 if(data->
voiNr<=1)
return(0);
881 qsort(data->
voi, data->
voiNr,
sizeof(
Voi), dftQSortPlane);
885int dftQSortPlane(
const void *voi1,
const void *voi2)
889 res=strcasecmp( ((
Voi*)voi1)->place, ((
Voi*)voi2)->place );
890 if(res!=0)
return(res);
891 res=strcasecmp( ((
Voi*)voi1)->name, ((
Voi*)voi2)->name );
892 if(res!=0)
return(res);
893 res=strcasecmp( ((
Voi*)voi1)->voiname, ((
Voi*)voi2)->voiname );
894 if(res!=0)
return(res);
895 res=strcasecmp( ((
Voi*)voi1)->hemisphere, ((
Voi*)voi2)->hemisphere );
910 if(dft==NULL)
return 0;
911 for(fi=0; fi<dft->
frameNr; fi++) {
913 if(isnan(dft->
x1[fi])) na_nr++;
914 if(isnan(dft->
x2[fi])) na_nr++;
916 if(isnan(dft->
x[fi])) na_nr++;
918 for(ri=0; ri<dft->
voiNr; ri++)
if(isnan(dft->
voi[ri].
y[fi])) na_nr++;
935 double x1, x2, y1, y2, x, y;
937 if(dft==NULL || dft->
voiNr<1 || dft->
frameNr<1)
return(1);
938 for(ri=0; ri<dft->
voiNr; ri++)
for(fi=0; fi<dft->
frameNr; fi++) {
939 if(isnan(dft->
x[fi]))
return(2);
940 if(isnan(dft->
voi[ri].
y[fi])) {
942 if(dft->
x[fi]<0.0) {dft->
voi[ri].
y[fi]=0.0;
continue;}
945 for(x1=y1=nan(
""), fj=fi-1; fj>=0; fj--)
if(!isnan(dft->
voi[ri].
y[fj])) {
946 x1=dft->
x[fj]; y1=dft->
voi[ri].
y[fj];
break;
948 if(isnan(x1) || isnan(y1)) x1=y1=0.0;
950 for(x2=y2=nan(
""), fj=fi+1; fj<dft->
frameNr; fj++)
if(!isnan(dft->
voi[ri].
y[fj])) {
951 x2=dft->
x[fj]; y2=dft->
voi[ri].
y[fj];
break;
953 if(isnan(x2) || isnan(y2))
for(fj=fi-1; fj>=0; fj--)
if(!isnan(dft->
voi[ri].
y[fj])) {
954 x2=dft->
x[fj]; y2=dft->
voi[ri].
y[fj];
break;
956 if(isnan(x2) || isnan(y2))
return(2);
958 if(x2==x1) y=0.5*(y1+y2);
else y=y2-(x2-x)*(y2-y1)/(x2-x1);
959 dft->
voi[ri].
y[fi]=y;
987 double x1, x2, y1, y2;
989 if(dft==NULL)
return(1);
991 for(fi=0; fi<dft->
frameNr; fi++) {
992 for(ri=0, n=0; ri<dft->
voiNr; ri++)
if(!isnan(dft->
voi[ri].
y[fi])) {
993 if(isnan(y1) || y1>dft->
voi[ri].
y[fi]) y1=dft->
voi[ri].
y[fi];
994 if(isnan(y2) || y2<dft->voi[ri].y[fi]) y2=dft->
voi[ri].
y[fi];
999 if(!isnan(dft->
x1[fi])) {
1000 if(isnan(x1) || x1>dft->
x1[fi]) x1=dft->
x1[fi];
1002 if(!isnan(dft->
x2[fi])) {
1003 if(isnan(x2) || x2<dft->x2[fi]) x2=dft->
x2[fi];
1005 }
else if(!isnan(dft->
x[fi])) {
1006 if(isnan(x1) || x1>dft->
x[fi]) x1=dft->
x[fi];
1007 if(isnan(x2) || x2<dft->x[fi]) x2=dft->
x[fi];
1010 if(minx!=NULL) {
if(isnan(x1))
return(3);
else *minx=x1;}
1011 if(maxx!=NULL) {
if(isnan(x2))
return(4);
else *maxx=x2;}
1012 if(miny!=NULL) {
if(isnan(y1))
return(5);
else *miny=y1;}
1013 if(maxy!=NULL) {
if(isnan(y2))
return(6);
else *maxy=y2;}
1046 int ri, fi, i1, i2, s1, s2;
1047 double x, x1, x2, y1, y2;
1049 if(dft==NULL)
return(1);
1050 if(tacindex>=dft->
voiNr)
return(2);
1053 x1=x2=y1=y2=nan(
""); i1=i2=s1=s2=0;
1054 for(fi=0; fi<dft->
frameNr; fi++) {
1056 if(isnan(dft->
x1[fi]))
continue;
1057 if(isnan(dft->
x2[fi]))
continue;
1058 x=0.5*(dft->
x1[fi]+dft->
x2[fi]);
1060 if(isnan(dft->
x[fi]))
continue;
1063 for(ri=0; ri<dft->
voiNr; ri++)
if(!isnan(dft->
voi[ri].
y[fi])) {
1064 if(tacindex>=0 && ri!=tacindex)
continue;
1065 if(isnan(y1) || y1>dft->
voi[ri].
y[fi]) {
1066 y1=dft->
voi[ri].
y[fi]; i1=ri; x1=x; s1=fi;}
1067 if(isnan(y2) || y2<dft->voi[ri].y[fi]) {
1068 y2=dft->
voi[ri].
y[fi]; i2=ri; x2=x; s2=fi;}
1071 if(minx!=NULL) {
if(isnan(x1))
return(11);
else *minx=x1;}
1072 if(maxx!=NULL) {
if(isnan(x2))
return(12);
else *maxx=x2;}
1073 if(miny!=NULL) {
if(isnan(y1))
return(13);
else *miny=y1;}
1074 if(maxy!=NULL) {
if(isnan(y2))
return(14);
else *maxy=y2;}
1075 if(mini!=NULL) {
if(isnan(y1))
return(13);
else *mini=i1;}
1076 if(maxi!=NULL) {
if(isnan(y2))
return(14);
else *maxi=i2;}
1077 if(mins!=NULL) {
if(isnan(y1))
return(13);
else *mins=s1;}
1078 if(maxs!=NULL) {
if(isnan(y2))
return(14);
else *maxs=s2;}
1103 double x1, x2, y1, y2;
1105 if(dft==NULL)
return(1);
1107 for(fi=0; fi<dft->
frameNr; fi++) {
1109 if(!isfinite(dft->
x1[fi]) || !isfinite(dft->
x2[fi]))
continue;
1110 x1=dft->
x1[fi]; x2=dft->
x2[fi];
1112 if(!isfinite(dft->
x[fi]))
continue;
1115 if(x2<t1 || x1>t2)
continue;
1116 for(ri=0; ri<dft->
voiNr; ri++)
if(!isnan(dft->
voi[ri].
y[fi])) {
1117 if(isnan(y1) || y1>dft->
voi[ri].
y[fi]) y1=dft->
voi[ri].
y[fi];
1118 if(isnan(y2) || y2<dft->voi[ri].y[fi]) y2=dft->
voi[ri].
y[fi];
1121 if(miny!=NULL) {
if(isnan(y1))
return(5);
else *miny=y1;}
1122 if(maxy!=NULL) {
if(isnan(y2))
return(6);
else *maxy=y2;}
1136 if(data==NULL)
return(nan(
""));
1137 for(i=0; i<data->
voiNr ;i++) {
1138 for(j=0; j<data->
frameNr; j++) {
1139 if(!isnan(data->
voi[i].
y[j]) && data->
voi[i].
y[j]<min) min=data->
voi[i].
y[j];
1155 if(data==NULL)
return(nan(
""));
1156 for(i=0; i<data->
voiNr ;i++){
1157 for(j=0; j<data->
frameNr; j++){
1158 if(!isnan(data->
voi[i].
y[j]) && data->
voi[i].
y[j]>max) max=data->
voi[i].
y[j];
1176 if(dft==NULL || dft->
voiNr<1 || dft->
frameNr<1)
return(1);
1177 for(fi=0; fi<dft->
frameNr-1; fi++)
for(fj=fi+1; fj<dft->
frameNr; fj++) {
1178 if(dft->
x[fj]>=dft->
x[fi])
continue;
1179 d=dft->
x[fi]; dft->
x[fi]=dft->
x[fj]; dft->
x[fj]=d;
1180 d=dft->
x1[fi]; dft->
x1[fi]=dft->
x1[fj]; dft->
x1[fj]=d;
1181 d=dft->
x2[fi]; dft->
x2[fi]=dft->
x2[fj]; dft->
x2[fj]=d;
1182 d=dft->
w[fi]; dft->
w[fi]=dft->
w[fj]; dft->
w[fj]=d;
1183 for(ri=0; ri<dft->
voiNr; ri++) {
1184 d=dft->
voi[ri].
y[fi]; dft->
voi[ri].
y[fi]=dft->
voi[ri].
y[fj]; dft->
voi[ri].
y[fj]=d;
1206 double overlap, overlap_limit=1.8, flen1, flen2;
1208 if(dft==NULL)
return(1);
1211 if(dft->
timeunit==TUNIT_MIN) overlap_limit/=60.0;
1212 for(fi=0; fi<dft->
frameNr-1; fi++) {
1213 overlap=dft->
x2[fi] - dft->
x1[fi+1];
1214 if(overlap==0.0)
continue;
1215 else if(overlap<-overlap_limit)
continue;
1216 else if(overlap>overlap_limit)
return(2);
1218 flen1=dft->
x2[fi]-dft->
x1[fi]; flen2=dft->
x2[fi+1]-dft->
x1[fi+1];
1220 if(flen1>flen2) dft->
x2[fi]=dft->
x1[fi+1];
else dft->
x1[fi+1]=dft->
x2[fi];
1222 if(flen1>flen2) dft->
x1[fi+1]=dft->
x2[fi];
else dft->
x2[fi]=dft->
x1[fi+1];
1245 double overlap, overlap_limit=0.0, flen1, flen2;
1247 if(dft==NULL)
return(1);
1249 for(fi=0; fi<dft->
frameNr-1; fi++) {
1250 overlap=dft->
x2[fi] - dft->
x1[fi+1];
1251 if(overlap==0.0)
continue;
1253 flen1=dft->
x2[fi]-dft->
x1[fi]; flen2=dft->
x2[fi+1]-dft->
x1[fi+1];
1254 if(flen1<0.0 || flen2<0.0)
return(1);
1256 if(flen1<flen2) overlap_limit=0.2*flen1;
else overlap_limit=0.2*flen2;
1258 if(overlap<-overlap_limit)
continue;
1259 if(overlap>overlap_limit)
return(2);
1262 if(flen1>flen2) dft->
x2[fi]=dft->
x1[fi+1];
else dft->
x1[fi+1]=dft->
x2[fi];
1264 if(flen1>flen2) dft->
x1[fi+1]=dft->
x2[fi];
else dft->
x2[fi]=dft->
x1[fi+1];
1285 int i, j, voi, first, origNr;
1287 if(dft==NULL || dft->
frameNr<1 || dft->
voiNr<1)
return(1);
1288 if(endT<startT)
return(2);
1289 if(startT<=dft->x[0] && endT>=dft->
x[dft->
frameNr-1])
return(0);
1293 for(j=dft->
frameNr-1; j>=0; j--)
if(dft->
x[j]<=endT)
break;
1297 for(j=0, first=-1; j<dft->
frameNr; j++)
1298 if(dft->
x[j]>=startT) {first=j;
break;}
1305 if(first>0)
for(j=first, i=0; j<dft->
frameNr; j++, i++) {
1306 dft->
x[i]=dft->
x[j]; dft->
x1[i]=dft->
x1[j]; dft->
x2[i]=dft->
x2[j];
1307 dft->
w[i]=dft->
w[j];
1308 for(voi=0; voi<dft->
voiNr; voi++) {
1309 dft->
voi[voi].
y[i]=dft->
voi[voi].
y[j];
1332 if(dft==NULL)
return;
1336 sprintf(tmp,
"# scan_start_time := %s\n", dft->
scanStartTime);
1340 sprintf(tmp,
"# injection_time := %s\n", dft->
injectionTime);
1343 strcpy(tmp,
"# decay_correction := ");
1346 else strcat(tmp,
"Unknown\n");
1349 sprintf(tmp,
"# isotope := %s\n", dft->
isotope);
1361 sprintf(tmp,
"# study_number := %s\n", dft->
studynr);
1369 sprintf(tmp,
"# unit := %s\n", dft->
unit );
1393 if(dft==NULL)
return 1;
1398 if(dft->
x1[0]<=0.0)
return 0;
1400 if(dft->
x[0]<=0.0)
return 0;
1404 dftInit(&temp); ret=
dftdup(dft, &temp);
if(ret!=0)
return 10+ret;
1420 for(ri=0; ri<temp.
voiNr; ri++) {
1426 for(fi=0; fi<temp.
frameNr; fi++) {
1427 dft->
voi[ri].
y[fi+1]=temp.
voi[ri].
y[fi];
1432 dft->
voi[ri].
y[0]=0.0;
1433 dft->
voi[ri].
y2[0]=0.0;
1434 dft->
voi[ri].
y3[0]=0.0;
1436 for(fi=0; fi<temp.
frameNr; fi++) {
1437 dft->
x1[fi+1]=temp.
x1[fi];
1438 dft->
x2[fi+1]=temp.
x2[fi];
1439 dft->
x[fi+1]=temp.
x[fi];
1440 dft->
w[fi+1]=temp.
w[fi];
1448 dft->
x2[0]=dft->
x1[1];
1449 dft->
x[0]=0.5*(dft->
x1[0]+dft->
x2[0]);
1452 dft->
x2[0]=dft->
x1[1];
1475 if(dft==NULL || dft->
frameNr<1 || dft->
voiNr<1)
return 1;
1476 if(nr_to_add<1)
return 0;
1479 dftInit(&temp); ret=
dftdup(dft, &temp);
if(ret!=0)
return 10+ret;
1495 for(ri=0; ri<temp.
voiNr; ri++) {
1501 for(fi=0; fi<temp.
frameNr; fi++) {
1502 dft->
voi[ri].
y[fi]=temp.
voi[ri].
y[fi];
1507 dft->
voi[ri].
y[0]=0.0;
1508 dft->
voi[ri].
y2[0]=0.0;
1509 dft->
voi[ri].
y3[0]=0.0;
1511 for(fi=0; fi<temp.
frameNr; fi++) {
1512 dft->
x1[fi]=temp.
x1[fi];
1513 dft->
x2[fi]=temp.
x2[fi];
1514 dft->
x[fi]=temp.
x[fi];
1515 dft->
w[fi]=temp.
w[fi];
1519 for(fi=temp.
frameNr; fi<dft->frameNr; fi++) {
1521 dft->
x1[fi]=dft->
x2[fi]=dft->
x[0]=0.0;
1522 for(ri=0; ri<dft->
voiNr; ri++) dft->
voi[ri].
y[fi]=nan(
"");
1544 if(dft==NULL || dft->
voiNr<1)
return;
1545 if(hemisphere==0 && place==0)
return;
1550 for(ri=n=1; ri<dft->
voiNr; ri++)
1553 for(ri=0; ri<dft->
voiNr; ri++)
1557 for(ri=n=1; ri<dft->
voiNr; ri++)
1560 for(ri=0; ri<dft->
voiNr; ri++)
1565 for(ri=0; ri<dft->
voiNr; ri++)
1591 if(dft==NULL ||
mean==NULL)
return(1);
1597 if(ret!=0)
return(100+ret);
1599 strcpy(
mean->voi[0].name,
"Mean");
1600 strcpy(
mean->voi[0].voiname,
mean->voi[0].name);
1604 for(fi=0; fi<dft->
frameNr; fi++) {
1606 for(ri=0; ri<dft->
voiNr; ri++)
if(!isnan(dft->
voi[ri].
y[fi])) {
1607 sum+=dft->
voi[ri].
y[fi];
1608 ssum+=dft->
voi[ri].
y[fi]*dft->
voi[ri].
y[fi];
1612 mean->voi[0].y[fi]=
mean->voi[0].y2[fi]=
mean->voi[0].y3[fi]=nan(
"");
1614 mean->voi[0].y[fi]=sum/(double)n;
1616 mean->voi[0].y2[fi]=
mean->voi[0].y3[fi]=0.0;
1618 mean->voi[0].y2[fi]=sqrt((ssum-sum*sum/(
double)n)/(
double)(n-1));
1619 if(fabs(
mean->voi[0].y[fi])>1.0E-25)
1620 mean->voi[0].y3[fi]=fabs(
mean->voi[0].y2[fi]/
mean->voi[0].y[fi]);
1622 mean->voi[0].y3[fi]=0.0;
1649 if(dft==NULL || dft->
voiNr<0 || dft->
frameNr<0)
return(0);
1650 if(index>dft->
voiNr-1)
return(0);
1654 for(
int i=0; i<dft->
frameNr; i++) {
1656 else x=0.5*(dft->
x1[i]+dft->
x2[i]);
1657 if(isnan(x) || !isfinite(x))
continue;
1658 if(x<tstart || x>tstop)
continue;
1659 if(isnan(dft->
voi[index].
y[i]) || !isfinite(dft->
voi[index].
y[i]))
1668 for(
int j=1; j<dft->
voiNr; j++) {
int dftAddnullframe(DFT *data)
int dftCopyvoihdr(DFT *dft1, int from, DFT *dft2, int to)
int dftRemoveTimeRange(DFT *dft, double startT, double endT)
int dftMinMaxTAC(DFT *dft, int tacindex, double *minx, double *maxx, double *miny, double *maxy, int *mini, int *maxi, int *mins, int *maxs)
int dftdup(DFT *dft1, DFT *dft2)
int dftDeleteFrameOverlap(DFT *dft)
int dftAddmem(DFT *dft, int voiNr)
int dftMovevoi(DFT *dft, int from, int to)
int dftAddSpaceForFrames(DFT *dft, int nr_to_add)
void dftSetComments(DFT *dft)
int dftSortByFrame(DFT *dft)
int dftSelectBestReference(DFT *dft)
int dftCopymainhdr2(DFT *dft1, DFT *dft2, int ow)
int dftMinMax(DFT *dft, double *minx, double *maxx, double *miny, double *maxy)
int dftCopyvoi(DFT *data, int from, int to)
int dftDelete(DFT *dft, int voi)
int dftMaxY(DFT *dft, double t1, double t2, double *miny, double *maxy)
int dftValidNr(DFT *dft, double tstart, double tstop, int index)
int dftMeanTAC(DFT *dft, DFT *mean)
int dftSetmem(DFT *data, int frameNr, int voiNr)
double dft_kBqMin(DFT *data)
int dftAdd(DFT *data1, DFT *data2, int voi)
int dftFillInitialGap(DFT *dft)
double dft_kBqMax(DFT *data)
void dftRNameSimplify(DFT *dft, int hemisphere, int place)
int dft_nr_of_NA(DFT *dft)
int dftSortPlane(DFT *data)
int dftSelectRegions(DFT *dft, char *region_name, int reset)
int dftAllocateWithHeader(DFT *dft, int frameNr, int voiNr, DFT *dft_from)
int dftDeleteFrameOverlap_old(DFT *dft)
void dftFrametimes(DFT *data)
int dftSelect(DFT *data, char *name)
int dftCopymainhdr(DFT *dft1, DFT *dft2)
int dftOverflow(DFT *data)
Header file for libtpccurveio.
#define DFT_DECAY_UNKNOWN
#define DFT_DECAY_NOTCORRECTED
#define DFT_FORMAT_STANDARD
#define DFT_DECAY_CORRECTED
#define DFT_TIME_STARTEND
int rnameCatenate(char *rname, int max_rname_len, char *name1, char *name2, char *name3, char space)
int petCunitId(const char *unit)
int rnameMatch(char *rname, int rnr, char *test_str)
#define MAX_REGIONNAME_LEN
char * petTunit(int tunit)
int mean(double *x, double *y, int nr, double *xmean, double *xsd, double *ymean, double *ysd)
char studynr[MAX_STUDYNR_LEN+1]
char comments[_DFT_COMMENT_LEN+1]
char unit[MAX_UNITS_LEN+1]
char radiopharmaceutical[32]
char voiname[MAX_REGIONSUBNAME_LEN+1]
char name[MAX_REGIONNAME_LEN+1]
char hemisphere[MAX_REGIONSUBNAME_LEN+1]
char place[MAX_REGIONSUBNAME_LEN+1]