void Config::init () { if (Path::is_file (MRTRIX_SYS_CONFIG_FILE)) { INFO ("reading config file \"" MRTRIX_SYS_CONFIG_FILE "\"..."); try { KeyValue kv (MRTRIX_SYS_CONFIG_FILE); while (kv.next()) { config[kv.key()] = kv.value(); } } catch (...) { } } std::string path = Path::join (Path::home(), MRTRIX_USER_CONFIG_FILE); if (Path::is_file (path)) { INFO ("reading config file \"" + path + "\"..."); try { KeyValue kv (path); while (kv.next()) { config[kv.key()] = kv.value(); } } catch (...) { } } }
void run () { const std::string path = argument[0]; Tractography::Properties properties; Tractography::Reader<float> reader (path, properties); size_t init_count = 0; if (properties.find ("count") == properties.end()) { INFO ("\"count\" field not set in file " + path); } else { init_count = to<size_t>(properties["count"]); INFO ("Value of \"count\" in file " + path + " is " + str(init_count)); } // Read the actual number of streamlines in the file Tractography::Streamline<float> tck; size_t count = 0; { ProgressBar progress ("evaluating actual streamline data count..."); while (reader (tck)) { ++count; ++progress; } } reader.close(); INFO ("Actual number of streamlines read is " + str(count)); // Find the appropriate file offset in the header KeyValue kv (argument[0], "mrtrix tracks"); std::string data_file; int64_t count_offset = 0; int64_t current_offset = 0; while (kv.next()) { std::string key = lowercase (kv.key()); if (key == "count") count_offset = current_offset; current_offset = kv.tellg(); } kv.close(); if (!count_offset) throw Exception ("could not find location of \"count\" field in file \"" + path + "\""); DEBUG ("File offset for \"count\" field is " + str(count_offset)); // Overwrite this data // Used C-style file access here as ofstream would either wipe the file contents, or // append the data instead of inserting it FILE* fp; fp = fopen (path.c_str(), "r+"); if (!fp) throw Exception ("could not open tracks file \"" + path + "\" for repair"); if (fseek (fp, count_offset, SEEK_SET)) { fclose (fp); throw Exception ("unable to seek to the appropriate position in the file"); } const std::string string = "count: " + str(count) + "\ntotal_count: " + str(count) + "\nEND\n"; const int rvalue = fputs (string.c_str(), fp); fclose (fp); if (rvalue == EOF) { WARN ("\"count\" field may not have been properly updated"); } else { INFO ("\"count\" field updated successfully"); } }