Created
October 6, 2010 22:00
-
-
Save simleb/614175 to your computer and use it in GitHub Desktop.
Create a CLF file out of a ASCII sheep data file
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdlib.h> | |
#include <stdio.h> | |
#include <string.h> | |
#include "CLF.h" | |
#define MAXLINE 256 /* Maximum length of a line */ | |
int main(int argc, char * argv[]) | |
{ | |
int n, sheepid, id, *idframes, ntracks, nframes, mintime; | |
float time, *t, *x, *y, *z, *vx, *vy, *vz; | |
char *datapath, *clfpath; | |
char group, line[MAXLINE]; | |
FILE *file; | |
CLF *clf; | |
if (argc != 9) | |
{ | |
printf("usage: convert maxtracknumber maxframenumber mintime trackid sheepid group datapath clfpath\n"); | |
return EXIT_SUCCESS; | |
} | |
ntracks = atol(argv[1]); | |
nframes = atol(argv[2]); | |
mintime = atol(argv[3]); | |
id = atol(argv[4]); | |
sheepid = atol(argv[5]); | |
group = argv[6][0]; | |
datapath = malloc((strlen(argv[7])+1) * sizeof(char)); | |
strcpy(datapath, argv[7]); | |
clfpath = malloc((strlen(argv[8])+1) * sizeof(char)); | |
strcpy(clfpath, argv[8]); | |
if (!(file = fopen(datapath, "r"))) | |
{ | |
fprintf(stderr, "convert: Cannot open data file '%s'\n", datapath); | |
return EXIT_FAILURE; | |
} | |
/* Create a new or open an existing CLF file */ | |
clf = CLFInit(); | |
if (!(CLFOpen(clf, clfpath, "w") || CLFCreate(clf, clfpath, ntracks, nframes))) | |
{ | |
fprintf(stderr, "convert: Cannot create or open CLF file '%s'\n", clfpath); | |
return EXIT_FAILURE; | |
} | |
if (CLFAddField(clf, "time", CLF_TRACK, "float")) | |
{ | |
CLFAddField(clf, "id", CLF_FRAME, "int"); | |
CLFAddField(clf, "group", CLF_FRAME, "char"); | |
CLFAddField(clf, "x", CLF_NORMAL, "float"); | |
CLFAddField(clf, "y", CLF_NORMAL, "float"); | |
CLFAddField(clf, "z", CLF_NORMAL, "float"); | |
CLFAddField(clf, "vx", CLF_NORMAL, "float"); | |
CLFAddField(clf, "vy", CLF_NORMAL, "float"); | |
CLFAddField(clf, "vz", CLF_NORMAL, "float"); | |
} | |
/* Alloc memory */ | |
idframes = (int*)calloc(nframes, sizeof(int)); | |
t = (float*)calloc(nframes, sizeof(float)); | |
x = (float*)calloc(nframes, sizeof(float)); | |
y = (float*)calloc(nframes, sizeof(float)); | |
z = (float*)calloc(nframes, sizeof(float)); | |
vx = (float*)calloc(nframes, sizeof(float)); | |
vy = (float*)calloc(nframes, sizeof(float)); | |
vz = (float*)calloc(nframes, sizeof(float)); | |
if (!idframes || !t || !x || !y || !z || !vx || !vy || !vz) | |
{ | |
fprintf(stderr, "convert: out of memory!\n"); | |
return EXIT_FAILURE; | |
} | |
if (sheepid == 12) /* Sheep 12 is special... */ | |
{ | |
/* Skip the 21 first lines */ | |
for (n = 0; n < 21; n++) | |
fgets(line, MAXLINE, file); | |
/* For each line, store the data in memory */ | |
for (n = 0; fgets(line, MAXLINE, file); n++) | |
{ | |
time = atof(strtok(line, " ")); | |
idframes[n] = (int)time - mintime; | |
t[n] = time; | |
y[n] = atof(strtok(NULL, " ")); | |
x[n] = atof(strtok(NULL, " ")); | |
atof(strtok(NULL, " ")); | |
atof(strtok(NULL, " ")); | |
z[n] = atof(strtok(NULL, " ")); | |
atof(strtok(NULL, " ")); | |
vy[n] = atof(strtok(NULL, " ")); | |
atof(strtok(NULL, " ")); | |
vx[n] = atof(strtok(NULL, " ")); | |
atof(strtok(NULL, " ")); | |
vz[n] = atof(strtok(NULL, " ")); | |
} | |
} | |
else | |
{ | |
/* Skip the 17 first lines */ | |
for (n = 0; n < 17; n++) | |
fgets(line, MAXLINE, file); | |
/* For each line, store the data in memory */ | |
for (n = 0; fgets(line, MAXLINE, file); n++) | |
{ | |
time = atof(strtok(line, " ")); | |
idframes[n] = (int)time - mintime; | |
t[n] = time; | |
x[n] = atof(strtok(NULL, " ")); | |
y[n] = atof(strtok(NULL, " ")); | |
z[n] = atof(strtok(NULL, " ")); | |
vy[n] = atof(strtok(NULL, " ")); | |
vz[n] = atof(strtok(NULL, " ")); | |
vx[n] = atof(strtok(NULL, " ")); | |
} | |
} | |
/* Close file */ | |
fclose(file); | |
/* Write tracks */ | |
CLFWriteFrame(clf, "id", 0, 1, &id, &sheepid); | |
CLFWriteFrame(clf, "group", 0, 1, &id, &group); | |
CLFWriteTrack(clf, "time", id, n, idframes, t); | |
CLFWriteTrack(clf, "x", id, n, idframes, x); | |
CLFWriteTrack(clf, "y", id, n, idframes, y); | |
CLFWriteTrack(clf, "z", id, n, idframes, z); | |
CLFWriteTrack(clf, "vx", id, n, idframes, vx); | |
CLFWriteTrack(clf, "vy", id, n, idframes, vy); | |
CLFWriteTrack(clf, "vz", id, n, idframes, vz); | |
/* Close CLF */ | |
CLFClose(clf); | |
/* Free memory */ | |
free(idframes); | |
free(t); | |
free(x); | |
free(y); | |
free(z); | |
free(vx); | |
free(vy); | |
free(vz); | |
free(datapath); | |
free(clfpath); | |
return EXIT_SUCCESS; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
To build a CLF file using this little program, one typically uses: