Read an old TAC file in *.roi.kbq / *.roi.nci format.
100 {
101 FILE *fp;
102 int i, j, k, l, roi_nr=0, frame_nr=0, ret, nr=0;
104 double a, b;
105
106
107
108 if(dft==NULL || fname==NULL) {
109 strcpy(
dfterrmsg,
"program fault");
return(1);}
110
112
113
114 fp=fopen(fname, "r");
115 if(fp==NULL) {strcpy(
dfterrmsg,
"cannot open file");
return(2);}
116
117
118 rewind(fp); i=0;
120 roikbq_strip_spaces(line); if(!strlen(line) || line[0]=='#') continue;
121 if(!isalpha((int)line[0])) continue;
122 if(strncasecmp(line, "cpt2nci 3", 9)==0) {i=1; break;}
123 }
124 if(i==0) {strcpy(
dfterrmsg,
"unsupported file format"); fclose(fp);
return(3);}
125
126
127 rewind(fp); roi_nr=frame_nr=0;
128
129 c=fgetc(fp);
130 if(c=='#') roikbq_move_to_next_line(fp); else ungetc(c, fp);
131 i=roikbq_fgets(fp, 16, tmp);
132 if(i<16) {strcpy(
dfterrmsg,
"unsupported file format"); fclose(fp);
return(3);}
133 while(i>13) {
134 i=roikbq_fgets(fp, 14, tmp); if(i>11 && isalnum((int)tmp[0])) roi_nr++;
135 }
136
137 roikbq_move_to_next_line(fp); roikbq_move_to_next_line(fp);
138
139 do {
140 c=fgetc(fp); if(c==EOF) break; if(c!='\n') frame_nr++;
141 roikbq_move_to_next_line(fp);
142 } while(c!=EOF);
143 if(roi_nr<1 || frame_nr<1) {
144 strcpy(
dfterrmsg,
"unsupported file format"); fclose(fp);
return(3);}
145
146
148 if(ret) {strcpy(
dfterrmsg,
"out of memory"); fclose(fp);
return(4);}
150
151
152
153 rewind(fp); c=fgetc(fp);
154 if(c=='#') roikbq_move_to_next_line(fp); else ungetc(c, fp);
155
156 j=roikbq_fgets(fp, 16, tmp);
157 if(j<16) {strcpy(
dfterrmsg,
"unsupported file format"); fclose(fp);
return(3);}
158 i=0; while (j>13) {
159 j=roikbq_fgets(fp, 14, tmp); if(i>=roi_nr) continue;
160 k=sscanf(tmp, "%s %s", s1, s2); if(k<1) continue;
161 if(k==1) s2[0]='\0';
164 if(s2[0]!='\0')
166 else
168 i++;
169 }
170 nr=i;
171
172 c=fgetc(fp); if(c=='#') roikbq_move_to_next_line(fp); else ungetc(c, fp);
173 j=roikbq_fgets(fp, 16, tmp);
174 if(j<16) {strcpy(
dfterrmsg,
"unsupported file format"); fclose(fp);
return(3);}
176 roikbq_strip_spaces(dft->
studynr);
177 i=0; while(j>13) {
178 j=roikbq_fgets(fp, 14, tmp); if(i>=nr) continue;
179 k=sscanf(tmp, "%s", s1); if(k<1) s1[0]='\0';
181 if(s1[0]!='\0') {
185 i++;
186 }
187 for(j=i; j<nr; j++) strcpy(dft->
voi[dft->
voiNr+j].
place,
"");
188
189 c=fgetc(fp); if(c=='#') roikbq_move_to_next_line(fp); else ungetc(c, fp);
190 j=roikbq_fgets(fp, 16, tmp);
191 if(j<16) {strcpy(
dfterrmsg,
"unsupported file format"); fclose(fp);
return(3);}
192 if(strstr(tmp,
"Times")) dft->
timetype=3;
193 else if(strstr(tmp,
"Start")) dft->
timetype=1;
194 else if(strstr(tmp,
"End")) dft->
timetype=2;
196 if(strstr(tmp,
"sec")) dft->
timeunit=TUNIT_SEC;
else dft->
timeunit=TUNIT_MIN;
197 i=0; while(j>13) {
198 j=roikbq_fgets(fp, 14, tmp); if(i>=nr) continue;
201 i++;
202 }
204
205 k=0; c=fgetc(fp); if(c=='#') roikbq_move_to_next_line(fp); else ungetc(c, fp);
206 while((j=roikbq_fgets(fp, 16, tmp))>15) {
207 if(k>=frame_nr) break;
208 roikbq_strip_spaces(tmp); if(strlen(tmp)==0) continue;
211 dft->
x1[k]=dft->
x2[k]=nan(
"");
213 sscanf(tmp,
"%lf %lf", &a, &b); dft->
x1[k]=a; dft->
x2[k]=b;
214 dft->
x[k]=0.5*(dft->
x1[k] + dft->
x2[k]);
216 dft->
x1[k]=dft->
x[k]=dft->
x2[k]=atof(tmp);
218 dft->
x2[k]=dft->
x[k]=dft->
x1[k]=atof(tmp);
219 }
220 if(dft->
x[k]<-3.e38) dft->
x[k]=nan(
"");
221 i=0; while(j>13) {
222 j=roikbq_fgets(fp, 14, tmp); if(i>=nr || j<13) continue;
223 roikbq_strip_spaces(tmp);
224 if(!strlen(tmp) || !strcmp(tmp,
".")) dft->
voi[dft->
voiNr+i].
y[k]=nan(
"");
225 else {
229 }
230 i++;
231 }
232 for(l=i; l<nr; l++) dft->
voi[dft->
voiNr+l].
y[k]=nan(
"");
233 k++;
234 c=fgetc(fp); if(c=='#') roikbq_move_to_next_line(fp); else ungetc(c, fp);
235 }
236 for(i=k; i<frame_nr; i++) {
238 for(j=dft->
voiNr; j<dft->voiNr+nr; j++) dft->
voi[j].
y[i]=nan(
"");
239 }
240
242
243 if(strstr(fname, ".nci")==NULL && strstr(fname, ".NCI")==NULL)
244 strcpy(dft->
unit,
"kBq/ml");
245 else strcpy(dft->
unit,
"nCi/ml");
246
248 for(i=0; i<dft->
frameNr; i++) dft->
w[i]=1.0;
249
250 return(0);
251}
int dftSetmem(DFT *data, int frameNr, int voiNr)
#define MAX_REGIONNAME_LEN
#define ROIKBQ_MAX_LINE_LEN
char studynr[MAX_STUDYNR_LEN+1]
char unit[MAX_UNITS_LEN+1]
char voiname[MAX_REGIONSUBNAME_LEN+1]
char name[MAX_REGIONNAME_LEN+1]
char hemisphere[MAX_REGIONSUBNAME_LEN+1]
char place[MAX_REGIONSUBNAME_LEN+1]