/* the main program when not doing a compile */ static int ccache_main(int argc, char *argv[]) { int c; size_t v; while ((c = getopt(argc, argv, "hszcCF:M:V")) != -1) { switch (c) { case 'V': printf("ccache version %s\n", CCACHE_VERSION); printf("Copyright Andrew Tridgell 2002\n"); printf("Released under the GNU GPL v2 or later\n"); exit(0); case 'h': usage(); exit(0); case 's': stats_summary(); break; case 'c': cleanup_all(cache_dir); printf("Cleaned cache\n"); break; case 'C': wipe_all(cache_dir); printf("Cleared cache\n"); break; case 'z': stats_zero(); printf("Statistics cleared\n"); break; case 'F': v = atoi(optarg); stats_set_limits(v, -1); printf("Set cache file limit to %u\n", (unsigned)v); break; case 'M': v = value_units(optarg); stats_set_limits(-1, v); printf("Set cache size limit to %uk\n", (unsigned)v); break; default: usage(); exit(1); } } return 0; }
/** * Creates a time series property from the currently opened log entry. It is * assumed to * have been checked to have a time field and the value entry's name is given as * an argument * @param file :: A reference to the file handle * @param prop_name :: The name of the property * @returns A pointer to a new property containing the time series */ Kernel::Property * LoadNexusLogs::createTimeSeries(::NeXus::File &file, const std::string &prop_name) const { file.openData("time"); //----- Start time is an ISO8601 string date and time. ------ std::string start; try { file.getAttr("start", start); } catch (::NeXus::Exception &) { // Some logs have "offset" instead of start try { file.getAttr("offset", start); } catch (::NeXus::Exception &) { g_log.warning() << "Log entry has no start time indicated.\n"; file.closeData(); throw; } } if (start.compare("No Time") == 0) { start = freqStart; } // Convert to date and time Kernel::DateAndTime start_time = Kernel::DateAndTime(start); std::string time_units; file.getAttr("units", time_units); if (time_units.compare("second") < 0 && time_units != "s" && time_units != "minutes") // Can be s/second/seconds/minutes { file.closeData(); throw ::NeXus::Exception("Unsupported time unit '" + time_units + "'"); } //--- Load the seconds into a double array --- std::vector<double> time_double; try { file.getDataCoerce(time_double); } catch (::NeXus::Exception &e) { g_log.warning() << "Log entry's time field could not be loaded: '" << e.what() << "'.\n"; file.closeData(); throw; } file.closeData(); // Close time data g_log.debug() << " done reading \"time\" array\n"; // Convert to seconds if needed if (time_units == "minutes") { std::transform(time_double.begin(), time_double.end(), time_double.begin(), std::bind2nd(std::multiplies<double>(), 60.0)); } // Now the values: Could be a string, int or double file.openData("value"); // Get the units of the property std::string value_units(""); try { file.getAttr("units", value_units); } catch (::NeXus::Exception &) { // Ignore missing units field. value_units = ""; } // Now the actual data ::NeXus::Info info = file.getInfo(); // Check the size if (size_t(info.dims[0]) != time_double.size()) { file.closeData(); throw ::NeXus::Exception("Invalid value entry for time series"); } if (file.isDataInt()) // Int type { std::vector<int> values; try { file.getDataCoerce(values); file.closeData(); } catch (::NeXus::Exception &) { file.closeData(); throw; } // Make an int TSP auto tsp = new TimeSeriesProperty<int>(prop_name); tsp->create(start_time, time_double, values); tsp->setUnits(value_units); g_log.debug() << " done reading \"value\" array\n"; return tsp; } else if (info.type == ::NeXus::CHAR) { std::string values; const int64_t item_length = info.dims[1]; try { const int64_t nitems = info.dims[0]; const int64_t total_length = nitems * item_length; boost::scoped_array<char> val_array(new char[total_length]); file.getData(val_array.get()); file.closeData(); values = std::string(val_array.get(), total_length); } catch (::NeXus::Exception &) { file.closeData(); throw; } // The string may contain non-printable (i.e. control) characters, replace // these std::replace_if(values.begin(), values.end(), iscntrl, ' '); auto tsp = new TimeSeriesProperty<std::string>(prop_name); std::vector<DateAndTime> times; DateAndTime::createVector(start_time, time_double, times); const size_t ntimes = times.size(); for (size_t i = 0; i < ntimes; ++i) { std::string value_i = std::string(values.data() + i * item_length, item_length); tsp->addValue(times[i], value_i); } tsp->setUnits(value_units); g_log.debug() << " done reading \"value\" array\n"; return tsp; } else if (info.type == ::NeXus::FLOAT32 || info.type == ::NeXus::FLOAT64) { std::vector<double> values; try { file.getDataCoerce(values); file.closeData(); } catch (::NeXus::Exception &) { file.closeData(); throw; } auto tsp = new TimeSeriesProperty<double>(prop_name); tsp->create(start_time, time_double, values); tsp->setUnits(value_units); g_log.debug() << " done reading \"value\" array\n"; return tsp; } else { throw ::NeXus::Exception( "Invalid value type for time series. Only int, double or strings are " "supported"); } }