231 {
232 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
233 if(par==NULL) {
236 }
237
242 }
243 if(verbose>0) printf("%s()\n", __func__);
244
245
246 if(strcasecmp(csv->
c[0].
content,
"Parameters")) {
249 }
250
251
252
254
255
256 int colNr=1, parNr=0;
257 for(
int i=1; i<csv->
nr; i++) {
258 if(csv->
c[i].
row==0) {
259 colNr++;
260
261 if(strncasecmp(csv->
c[i].
content,
"SD", 2)==0)
continue;
262 if(strncasecmp(csv->
c[i].
content,
"95%CL", 5)==0)
continue;
263 if(strcasecmp(csv->
c[i].
content,
"WSS")==0)
continue;
264 if(strcasecmp(csv->
c[i].
content,
"Model")==0)
continue;
265 if(strcasecmp(csv->
c[i].
content,
"Start[min]")==0)
continue;
266 if(strcasecmp(csv->
c[i].
content,
"End[min]")==0)
continue;
267 if(strcasecmp(csv->
c[i].
content,
"dataNr")==0)
continue;
268 if(strcasecmp(csv->
c[i].
content,
"fitNr")==0)
continue;
269 parNr++;
270 } else break;
271 }
272 if(parNr<1 || csv->row_nr<2) {
275 }
276 if(verbose>2) printf(" parNr := %d\n colNr := %d\n", parNr, colNr);
277
278
279 int ret;
283
284
285
286 int decimal_comma=-1;
287 ret=0;
if(csv->
separator==
',') decimal_comma=0;
288
289 for(
int ri=1; ri<csv->
row_nr; ri++) {
290 int i=ri*colNr;
if(i>=csv->
nr || csv->
c[i].
col!=0) {ret++;
break;}
292 }
293
294
295 parNr=0;
296 for(int ci=1; ci<colNr && ret==0; ci++) {
297
298 if(parNr>par->
parNr) {ret++;
break;}
299 int ri=0; int i=ri*colNr+ci;
300 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
301 if(strcasecmp(csv->
c[i].
content,
"Model")==0) {
302 for(ri=1; ri<csv->
row_nr; ri++) {
303 int i=ri*colNr+ci;
304 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
306 }
307 continue;
308 }
309 if(strncasecmp(csv->
c[i].
content,
"SD", 2)==0) {
310 if(parNr==0) {ret++; break;}
311 for(ri=1; ri<csv->
row_nr; ri++) {
312 i=ri*colNr+ci;
313 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
315 }
316 continue;
317 }
318 if(strncasecmp(csv->
c[i].
content,
"95%CL1", 6)==0) {
319 if(parNr==0) {ret++; break;}
320 for(ri=1; ri<csv->
row_nr; ri++) {
321 i=ri*colNr+ci;
322 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
324 }
325 continue;
326 }
327 if(strncasecmp(csv->
c[i].
content,
"95%CL2", 6)==0) {
328 if(parNr==0) {ret++; break;}
329 for(ri=1; ri<csv->
row_nr; ri++) {
330 i=ri*colNr+ci;
331 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
333 }
334 continue;
335 }
336 if(strcasecmp(csv->
c[i].
content,
"WSS")==0 || strcasecmp(csv->
c[i].
content,
"SS")==0) {
337 for(ri=1; ri<csv->
row_nr; ri++) {
338 i=ri*colNr+ci;
339 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
341 }
342 continue;
343 }
344 if(strncasecmp(csv->
c[i].
content,
"Start", 5)==0) {
345 for(ri=1; ri<csv->
row_nr; ri++) {
346 i=ri*colNr+ci;
347 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
349 }
350 continue;
351 }
352 if(strncasecmp(csv->
c[i].
content,
"End", 3)==0) {
353 for(ri=1; ri<csv->
row_nr; ri++) {
354 i=ri*colNr+ci;
355 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
357 }
358 continue;
359 }
360 if(strcasecmp(csv->
c[i].
content,
"dataNr")==0) {
361 for(ri=1; ri<csv->
row_nr; ri++) {
362 i=ri*colNr+ci;
363 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
365 }
366 continue;
367 }
368 if(strcasecmp(csv->
c[i].
content,
"fitNr")==0) {
369 for(ri=1; ri<csv->
row_nr; ri++) {
370 i=ri*colNr+ci;
371 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
373 }
374 continue;
375 }
376
377 char tmp[128];
378
380 {ret++; break;}
383
384
385
386 for(ri=1; ri<csv->
row_nr; ri++) {
387 i=ri*colNr+ci;
388 if(i>=csv->
nr || csv->
c[i].
col!=ci) {ret++;
break;}
390 if(decimal_comma<1) {
391
392 if(strchr(csv->
c[i].
content,
'.')!=NULL) decimal_comma=0;
393 else if(strchr(csv->
c[i].
content,
',')!=NULL) decimal_comma=1;
394 }
395 }
396 parNr++;
397 }
398 if(ret>0) {
402 }
403
404
405
406
407 {
408 int ci=-1;
409 for(
int i=0; i<par->
parNr; i++) {
410 if(!strcasecmp(par->
n[i].
name,
"WSS") || !strcasecmp(par->
n[i].
name,
"SS")) ci=i;
411 }
412 if(ci>=0 && ci<par->parNr && par->
parNr>1) {
413 if(verbose>4) {
414 printf("column %d contains WSS, moving to correct place\n", 1+ci); fflush(stdout);}
415 for(
int i=0; i<par->
tacNr; i++) par->
r[i].
wss=par->
r[i].
p[ci];
416
418 }
419 }
420
421
422
431 } else {
434 }
435
436
437
438
439 if(hdr!=NULL && hdr->
keyNr>0) {
440 if(verbose>4) {
441 printf(
"copying header contents (%d items) to PAR struct\n", hdr->
keyNr); fflush(stdout);}
443 if(verbose>0) {printf(" error in iftDuplicate()\n"); fflush(stdout);}
447 }
448
449 double v, f;
450 int i, n, u;
451 char key[32];
452
453 strcpy(key, "fit_start");
457 }
458 strcpy(key, "fit_end");
461 for(i=0; i<par->
tacNr; i++)
if(isnan(par->
r[i].
end)) par->
r[i].
end=v;
462 }
463 strcpy(key, "dataNr");
466 }
467 strcpy(key, "model");
469 if(i>=0) {
473 }
474 }
475
476
479}
int csvCleanSpaces(CSV *csv)
double atofVerified(const char *s)
int iftDelete(IFT *ift, int index)
int iftDuplicate(IFT *ift1, IFT *ift2)
int iftFindKey(IFT *ift, const char *key, int start_index)
int iftGetDoubleWithUnit(IFT *ift, int index, double *v, int *unit)
int iftGetInt(IFT *ift, int index, int *v)
unsigned int modelCodeIndex(const char *s)
int parDeletePar(PAR *par, int pi)
int parAllocate(PAR *par, int parNr, int tacNr)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
int strTokenNCpy(const char *s1, const char *s2, int i, char *s3, int count)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
IFT h
Optional (but often useful) header information.
char name[MAX_PARNAME_LEN+1]
char name[MAX_TACNAME_LEN+1]
int verbose
Verbose level, used by statusPrint() etc.
#define MAX_TACNAME_LEN
Max length of TAC ID name (not including trailing zero)
#define MAX_PARNAME_LEN
Max string length for PAR name.
@ TPCERROR_FAIL
General error.
@ TPCERROR_INVALID_FORMAT
Invalid file format.
@ TPCERROR_INVALID_HEADER
Invalid header contents.
@ TPCERROR_UNSUPPORTED
Unsupported file type.
@ TPCERROR_NO_DATA
File contains no data.
int unitIdentify(const char *s)
double unitConversionFactor(const int u1, const int u2)
@ PAR_FORMAT_CSV_UK
UK CSV.
@ PAR_FORMAT_CSV_INT
International CSV.
@ PAR_FORMAT_TSV_INT
International TSV (comma as decimal separator)
@ PAR_FORMAT_TSV_UK
UK TSV (point as decimal separator)