The track point data is stored as one binary file, with the filename extension of .trk. The first 1000 bytes consist a header with the following structure -
struct TRACK_HEADER { char id_string[6]; // first 5 chars must be "TRACK" short int dim[3]; // dimensions float voxel_size[3]; // voxel size float origin[3] // origin. default is 0,0,0. short int n_scalars; // number of scalars saved per point besides xyz coordinates. char pad1; unsigned char has_max_min; // indicate there are max and min values of the scalars stored in the header float max[10]; // maximum and minimum values of all the scalars. can store up to 10 pairs float min[10]; // these are yet to be implemented char reserved[868]; int n_count; // total number of tracks. if 0, number of tracks was not recorded. int version; // version number int hdr_size; // size of the header. used to determine byte swap };
Following the header are the track point data, in a formation of one integer (with value of n, for example) followed by n tuples. Each tuple consists of 3 float numbers (or 3+n_scalars float numbers if n_scalars is not 0, while the first 3 numbers always represent x/y/z coordinates of the point). And repeat on till the end of the file.
Download C++ code to read and write track file. (WARNING: There is absolutely no warranty or liability for this code. Use it at your own risk.)
TrackIO.hHere are a few sample lines to read track file -
include "TrackIO.h" ... CTrackReader reader; TRACK_HEADER header; if (!reader.Open("foo.trk", &header)) { printf(reader.GetLastErrorMessage()); return; } ... int cnt; if (ignore_scalars) { // The DTI task card does not save any scalar values to track file. // So scalars are always ignored while reading DTI task card generated track files. while (reader.GetNextPointCount(&cnt)) { float* pts = new float[cnt*3]; reader.GetNextTrackData(cnt, pts); ... process_point_data(...); ... delete[] pts; } } else { while (reader.GetNextPointCount(&cnt)) { float* pts = new float[cnt*3]; float* scalars = new float[cnt*header.n_scalars]; reader.GetNextTrackData(cnt, pts, scalars); ... process_point_and_scalar_data(...); ... delete[] pts; delete[] scalars; } } reader.Close();
|