static gchar* type_to_title(guint type) { const gchar *title; title = gwy_enuml_to_string(type, "Height", 0, "Current", 1, "FFM", 2, "Spect", 3, "SpectV", 4, "ADC1", 5, "ADC2", 6, "TipV", 7, "DAC1", 8, "DAC2", 9, "ZPiezo", 10, "Height error", 11, "Linearized Z", 12, "Feedback", 13, NULL); if (*title) return g_strdup(title); return NULL; }
static GwyContainer* pt3file_get_metadata(PicoHarpFile *pt3file) { GwyContainer *meta; meta = gwy_container_new(); add_meta_str("Format Version", format_version); add_meta_str("Creator Name", creator_name); add_meta_str("Creator Version", creator_version); add_meta_str("Date", file_time); add_meta_str("Comment", comment); add_meta_str("Hardware", board.hardware_ident); add_meta_str("Hardware Version", board.hardware_version); gwy_container_set_string_by_name (meta, "Measurement Mode", g_strdup_printf("%u", pt3file->measurement_mode)); gwy_container_set_string_by_name (meta, "Offset", g_strdup_printf("%d ns", pt3file->offset)); gwy_container_set_string_by_name (meta, "Acquisition Time", g_strdup_printf("%d ms", pt3file->acquisition_time)); gwy_container_set_string_by_name (meta, "Hardware Serial Number", g_strdup_printf("%u", pt3file->board.hardware_serial)); gwy_container_set_string_by_name (meta, "Imaging Device", g_strdup(gwy_enuml_to_string(pt3file->imaging.common.instrument, "PI E710", 1, "KDT180-100-Im", 2, "LSM", 3, NULL))); return meta; }
static GwyContainer* rhk_sm4_get_metadata(const RHKPageIndex *pi, const RHKPage *page) { static const gchar hex[] = "0123456789abcdef"; GwyContainer *meta; const gchar *s; gchar *str; guint i, w; meta = gwy_container_new(); s = gwy_enuml_to_string(page->page_type, "Topographic", RHK_PAGE_TOPOGAPHIC, "Current", RHK_PAGE_CURRENT, "Aux", RHK_PAGE_AUX, "Force", RHK_PAGE_FORCE, "Signal", RHK_PAGE_SIGNAL, "FFT transform", RHK_PAGE_FFT, "Noise power spectrum", RHK_PAGE_NOISE_POWER_SPECTRUM, "Line test", RHK_PAGE_LINE_TEST, "Oscilloscope", RHK_PAGE_OSCILLOSCOPE, "IV spectra", RHK_PAGE_IV_SPECTRA, "Image IV 4x4", RHK_PAGE_IV_4x4, "Image IV 8x8", RHK_PAGE_IV_8x8, "Image IV 16x16", RHK_PAGE_IV_16x16, "Image IV 32x32", RHK_PAGE_IV_32x32, "Image IV Center", RHK_PAGE_IV_CENTER, "Interactive spectra", RHK_PAGE_INTERACTIVE_SPECTRA, "Autocorrelation", RHK_PAGE_AUTOCORRELATION, "IZ spectra", RHK_PAGE_IZ_SPECTRA, "4 gain topography", RHK_PAGE_4_GAIN_TOPOGRAPHY, "8 gain topography", RHK_PAGE_8_GAIN_TOPOGRAPHY, "4 gain current", RHK_PAGE_4_GAIN_CURRENT, "8 gain current", RHK_PAGE_8_GAIN_CURRENT, "Image IV 64x64", RHK_PAGE_IV_64x64, "Autocorrelation spectrum", RHK_PAGE_AUTOCORRELATION_SPECTRUM, "Counter data", RHK_PAGE_COUNTER, "Multichannel analyser", RHK_PAGE_MULTICHANNEL_ANALYSER, "AFM using AFM-100", RHK_PAGE_AFM_100, "CITS", RHK_PAGE_CITS, "GBIB", RHK_PAGE_GPIB, "Video channel", RHK_PAGE_VIDEO_CHANNEL, "Image OUT spectra", RHK_PAGE_IMAGE_OUT_SPECTRA, "I_Datalog", RHK_PAGE_I_DATALOG, "I_Ecset", RHK_PAGE_I_ECSET, "I_Ecdata", RHK_PAGE_I_ECDATA, "DSP channel", RHK_PAGE_I_DSP_AD, "Discrete spectroscopy (present pos)", RHK_PAGE_DISCRETE_SPECTROSCOPY_PP, "Image discrete spectroscopy", RHK_PAGE_IMAGE_DISCRETE_SPECTROSCOPY, "Ramp spectroscopy (relative points)", RHK_PAGE_RAMP_SPECTROSCOPY_RP, "Discrete spectroscopy (relative points)", RHK_PAGE_DISCRETE_SPECTROSCOPY_RP, NULL); if (s && *s) gwy_container_set_string_by_name(meta, "Type", g_strdup(s)); s = gwy_enum_to_string(page->scan_dir, scan_directions, G_N_ELEMENTS(scan_directions)); if (s && *s) gwy_container_set_string_by_name(meta, "Scan Direction", g_strdup(s)); s = gwy_enuml_to_string(pi->source, "Raw", RHK_SOURCE_RAW, "Processed", RHK_SOURCE_PROCESSED, "Calculated", RHK_SOURCE_CALCULATED, "Imported", RHK_SOURCE_IMPORTED, NULL); if (s && *s) gwy_container_set_string_by_name(meta, "Source", g_strdup(s)); gwy_container_set_string_by_name(meta, "Bias", g_strdup_printf("%g V", page->bias)); gwy_container_set_string_by_name(meta, "Rotation angle", g_strdup_printf("%f", page->angle)); gwy_container_set_string_by_name(meta, "Period", g_strdup_printf("%f s", page->period)); s = page->strings[RHK_STRING_DATE]; if (s && *s) { str = g_strconcat(s, " ", page->strings[RHK_STRING_TIME], NULL); gwy_container_set_string_by_name(meta, "Date", str); } rhk_sm4_meta_string(page, RHK_STRING_LABEL, "Label", meta); rhk_sm4_meta_string(page, RHK_STRING_PATH, "Path", meta); rhk_sm4_meta_string(page, RHK_STRING_SYSTEM_TEXT, "System comment", meta); rhk_sm4_meta_string(page, RHK_STRING_SESSION_TEXT, "Session comment", meta); rhk_sm4_meta_string(page, RHK_STRING_USER_TEXT, "User comment", meta); str = g_new(gchar, 33); for (i = 0; i < 16; i++) { str[2*i] = hex[pi->id[i]/16]; str[2*i + 1] = hex[pi->id[i] % 16]; } str[32] = '\0'; gwy_container_set_string_by_name(meta, "Page ID", str); str = g_new(gchar, 9); w = page->group_id; for (i = 0; i < 8; i++) { str[7 - i] = hex[w & 0xf]; w = w >> 4; } str[8] = '\0'; gwy_container_set_string_by_name(meta, "Group ID", str); return meta; }
static GwyContainer* apefile_load(const gchar *filename, G_GNUC_UNUSED GwyRunType mode, GError **error) { APEFile apefile; GwyContainer *meta, *container = NULL; guchar *buffer = NULL; const guchar *p; gsize size = 0; GError *err = NULL; GwyDataField *dfield = NULL; guint b, i, n; if (!gwy_file_get_contents(filename, &buffer, &size, &err)) { err_GET_FILE_CONTENTS(error, &err); return NULL; } p = buffer; apefile.version = *(p++); if (size < 1294) { err_TOO_SHORT(error); gwy_file_abandon_contents(buffer, size, NULL); return NULL; } apefile.spm_mode = *(p++); p += 2; /* Skip VisualBasic VARIANT type type */ apefile.scan_date = gwy_get_gdouble_le(&p); apefile.maxr_x = gwy_get_gfloat_le(&p); apefile.maxr_y = gwy_get_gfloat_le(&p); apefile.x_offset = gwy_get_guint32_le(&p); apefile.y_offset = gwy_get_guint32_le(&p); apefile.size_flag = gwy_get_guint16_le(&p); apefile.res = 16 << apefile.size_flag; if (err_DIMENSION(error, apefile.res)) { gwy_file_abandon_contents(buffer, size, NULL); return NULL; } apefile.acquire_delay = gwy_get_gfloat_le(&p); apefile.raster_delay = gwy_get_gfloat_le(&p); apefile.tip_dist = gwy_get_gfloat_le(&p); apefile.v_ref = gwy_get_gfloat_le(&p); if (apefile.version == 1) { apefile.vpmt1 = gwy_get_guint16_le(&p); apefile.vpmt2 = gwy_get_guint16_le(&p); } else { apefile.vpmt1 = gwy_get_gfloat_le(&p); apefile.vpmt2 = gwy_get_gfloat_le(&p); } apefile.remark = g_strndup(p, 120); p += 120; apefile.x_piezo_factor = gwy_get_guint32_le(&p); apefile.y_piezo_factor = gwy_get_guint32_le(&p); apefile.z_piezo_factor = gwy_get_guint32_le(&p); apefile.hv_gain = gwy_get_gfloat_le(&p); apefile.freq_osc_tip = gwy_get_gdouble_le(&p); apefile.rotate = gwy_get_gfloat_le(&p); apefile.slope_x = gwy_get_gfloat_le(&p); apefile.slope_y = gwy_get_gfloat_le(&p); apefile.topo_means = gwy_get_guint16_le(&p); apefile.optical_means = gwy_get_guint16_le(&p); apefile.error_means = gwy_get_guint16_le(&p); /* g_printerr("%04x %04x %04x\n", apefile.topo_means, apefile.optical_means, apefile.error_means); */ apefile.channels = gwy_get_guint32_le(&p); apefile.ndata = 0; for (b = apefile.channels; b; b = b >> 1) apefile.ndata += (b & 1); apefile.range_x = gwy_get_gfloat_le(&p); apefile.range_y = gwy_get_gfloat_le(&p); apefile.subversion = gwy_get_guint16_le(&p); /* Read everything since the header is long enough, check the version * later when we decide whether to use these values or not. */ /* Since 2.1 */ apefile.hv_gain_z = gwy_get_gfloat_le(&p); /* Since 2.2 */ apefile.fast2_0 = gwy_get_gdouble_le(&p); apefile.fast2_1 = gwy_get_gdouble_le(&p); apefile.fast2_2 = gwy_get_gdouble_le(&p); apefile.fast2_3 = gwy_get_gdouble_le(&p); /* Since 2.3 */ apefile.pg850_image = !!gwy_get_guint16_le(&p); /* Since 2.4 */ apefile.xy_hv_status = gwy_get_gint16_le(&p); apefile.z_hv_status = gwy_get_gint16_le(&p); /* reserved */ p += 2; apefile.xreal = apefile.maxr_x * apefile.x_piezo_factor * apefile.range_x * apefile.hv_gain/65535.0 * 1e-9; apefile.yreal = apefile.maxr_y * apefile.y_piezo_factor * apefile.range_y * apefile.hv_gain/65535.0 * 1e-9; /* Use negated positive conditions to catch NaNs */ if (!((apefile.xreal = fabs(apefile.xreal)) > 0)) { g_warning("Real x size is 0.0, fixing to 1.0"); apefile.xreal = 1.0; } if (!((apefile.yreal = fabs(apefile.yreal)) > 0)) { g_warning("Real y size is 0.0, fixing to 1.0"); apefile.yreal = 1.0; } gwy_debug("version = %u.%u, spm_mode = %u", apefile.version, apefile.subversion, apefile.spm_mode); gwy_debug("scan_date = %f", apefile.scan_date); gwy_debug("maxr_x = %g, maxr_y = %g", apefile.maxr_x, apefile.maxr_y); gwy_debug("x_offset = %u, y_offset = %u", apefile.x_offset, apefile.y_offset); gwy_debug("size_flag = %u", apefile.size_flag); gwy_debug("acquire_delay = %g, raster_delay = %g, tip_dist = %g", apefile.acquire_delay, apefile.raster_delay, apefile.tip_dist); gwy_debug("v_ref = %g, vpmt1 = %g, vpmt2 = %g", apefile.v_ref, apefile.vpmt1, apefile.vpmt2); gwy_debug("x_piezo_factor = %u, y_piezo_factor = %u, z_piezo_factor = %u", apefile.x_piezo_factor, apefile.y_piezo_factor, apefile.z_piezo_factor); gwy_debug("hv_gain = %g, freq_osc_tip = %g, rotate = %g", apefile.hv_gain, apefile.freq_osc_tip, apefile.rotate); gwy_debug("slope_x = %g, slope_y = %g", apefile.slope_x, apefile.slope_y); gwy_debug("topo_means = %u, optical_means = %u, error_means = %u", apefile.topo_means, apefile.optical_means, apefile.error_means); gwy_debug("channel bitmask = %03x, ndata = %u", apefile.channels, apefile.ndata); gwy_debug("range_x = %g, range_y = %g", apefile.range_x, apefile.range_y); n = (apefile.res + 1)*(apefile.res + 1)*sizeof(float); if (size - (p - buffer) != n*apefile.ndata) { g_warning("Expected data size %u, but it's %u.", n*apefile.ndata, (guint)(size - (p - buffer))); apefile.ndata = MIN(apefile.ndata, (size - (p - buffer))/n); } if (!apefile.ndata) { err_NO_DATA(error); gwy_file_abandon_contents(buffer, size, NULL); return NULL; } fill_data_fields(&apefile, p); gwy_file_abandon_contents(buffer, size, NULL); container = gwy_container_new(); /* All metadata seems to be per-file (global) */ meta = apefile_get_metadata(&apefile); for (b = apefile.channels, n = 0, i = 0; b; b = b >> 1, i++) { GwyContainer *tmp; gchar *title; gchar key[32]; if (!(b & 1)) continue; g_snprintf(key, sizeof(key), "/%d/data", n); dfield = apefile.data[n]; gwy_container_set_object_by_name(container, key, dfield); g_object_unref(apefile.data[n]); g_snprintf(key, sizeof(key), "/%d/data/title", n); /* * Channel labelling based on SPM Mode */ switch (apefile.spm_mode) { case SPM_MODE_SNOM: title = gwy_enuml_to_string(i, "Height", APE_HEIGHT, "Height-R", APE_HEIGHT_R, "NSOM", APE_NSOM, "NSOM-R", APE_NSOM_R, "Error", APE_ERROR, "Error-R", APE_ERROR_R, "NSOM2", APE_NSOM2, "NSOM2-R", APE_NSOM2_R, "Lateral", APE_AUX1, "Z-Z0", APE_AUX2, "Lateral-R", APE_AUX1_R, "Z-Z0-R", APE_AUX2_R, NULL); break; case SPM_MODE_AFM_NONCONTACT: case SPM_MODE_AFM_CONTACT: case SPM_MODE_PHASE_DETECT_AFM: title = gwy_enuml_to_string(i, "Height", APE_HEIGHT, "Height-R", APE_HEIGHT_R, "IN1", APE_NSOM, "IN1-R", APE_NSOM_R, "Error", APE_ERROR, "Error-R", APE_ERROR_R, "IN2", APE_NSOM2, "IN2-R", APE_NSOM2_R, "Lateral", APE_AUX1, "Z-Z0", APE_AUX2, "Lateral-R", APE_AUX1_R, "Z-Z0-R", APE_AUX2_R, NULL); break; default: title = gwy_enuml_to_string(i, "Height", APE_HEIGHT, "Height-R", APE_HEIGHT_R, "IN1", APE_NSOM, "IN1-R", APE_NSOM_R, "Error", APE_ERROR, "Error-R", APE_ERROR_R, "IN2", APE_NSOM2, "IN2-R", APE_NSOM2_R, "Aux1", APE_AUX1, "Z-Z0", APE_AUX2, "Aux1-R", APE_AUX1_R, "Z-Z0-R", APE_AUX2_R, NULL); break; } if (title && *title) gwy_container_set_string_by_name(container, key, g_strdup(title)); tmp = gwy_container_duplicate(meta); g_snprintf(key, sizeof(key), "/%d/meta", n); gwy_container_set_object_by_name(container, key, tmp); g_object_unref(tmp); gwy_file_channel_import_log_add(container, n, NULL, filename); n++; } g_object_unref(meta); g_free(apefile.remark); return container; }
static GwyContainer* jeol_get_metadata(const JEOLImageHeader *header) { const JEOLSPMParam *spm_param; const JEOLDate *date; const JEOLTime *time_; GwyContainer *meta; const gchar *s; meta = gwy_container_new(); spm_param = &header->spm_param; format_meta(meta, "WinSPM Version", "%.2f", header->winspm_version/100.0); format_meta(meta, "Clock", "%g ms", spm_param->clock); format_meta(meta, "Rotation", "%g deg", spm_param->rotation); format_meta(meta, "Feedback filter", "%g Hz", spm_param->feedback_filter); format_meta(meta, "Present filter", "%g Hz", spm_param->present_filter); format_meta(meta, "Head amp gain", "%g V/nA", spm_param->head_amp_gain); if ((s = gwy_enuml_to_string(spm_param->mode, "Line1024", JEOL_MODE_LINE_1024, "Topo Mirror", JEOL_MODE_TOPO_MIRROR, "Topo512", JEOL_MODE_TOPO_512, "Topo256", JEOL_MODE_TOPO_256, "Topo128", JEOL_MODE_TOPO_128, "Line512", JEOL_MODE_LINE_512, "Line256", JEOL_MODE_LINE_256, "Line128", JEOL_MODE_LINE_128, "Topo ×2", JEOL_MODE_TOPO_X2, "Topo ×4", JEOL_MODE_TOPO_X4, "CITS", JEOL_MODE_CITS, "I-V", JEOL_MODE_I_V, "S-V", JEOL_MODE_S_V, "I-S", JEOL_MODE_I_S, "F-C", JEOL_MODE_F_C, "FFC", JEOL_MODE_FFC, "Montage128", JEOL_MODE_MONTAGE_128, "Montage256", JEOL_MODE_MONTAGE_256, "LSTS", JEOL_MODE_LSTS, "Topo SPS", JEOL_MODE_TOPO_SPS, "VCO", JEOL_MODE_VCO, "Topo Image", JEOL_MODE_TOPO_IMAGE, "Topo3 VE AFM", JEOL_MODE_TOPO3_VE_AFM, "Topo4 MFM", JEOL_MODE_TOPO4_MFM, "Topo3 LM FFM", JEOL_MODE_TOPO3_LM_FFM, "Topo2 FKM", JEOL_MODE_TOPO2_FKM, "Topo2 FFM", JEOL_MODE_TOPO2_FFM, "Topo1204", JEOL_MODE_TOPO_1204, "Topo 2×512", JEOL_MODE_TOPO_2X512, "Topo2 SCFM", JEOL_MODE_TOPO2_SCFM, "Topo2 MFM-1", JEOL_MODE_TOPO2_MFM_1, "Topo64", JEOL_MODE_TOPO64, "Phaseshift", JEOL_MODE_PHASE_SHIFT, "Manipulation", JEOL_MODE_MANIPULATION, "CS3D Scan", JEOL_MODE_CS3D_SCAN, "F-V", JEOL_MODE_F_V, "SoftwareGen", JEOL_MODE_SOFTWARE_GEN, NULL))) format_meta(meta, "Measurement mode", "%s", s); format_meta(meta, "Bias", "%g V", header->bias); /* FIXME: It's called `reference value' and it can be in V or nA. * What it means when it's V and how one can tell when it's what? */ format_meta(meta, "Tunnel current", "%g nA", header->reference_value); date = &header->measurement_date; time_ = &header->measurement_time; format_meta(meta, "Date and time of measurement", "%04d-%02d-%02d %02d:%02d:%02d.%02d", date->year_1980, date->month, date->day, time_->hour, time_->minute, time_->second, time_->second_100); date = &header->save_date; time_ = &header->save_time; format_meta(meta, "Date and time of file save", "%04d-%02d-%02d %02d:%02d:%02d.%02d", date->year_1980, date->month, date->day, time_->hour, time_->minute, time_->second, time_->second_100); format_meta(meta, "Tip speed X", "%g nm/s", header->tip_speed_x); format_meta(meta, "Tip speed Y", "%g nm/s", header->tip_speed_y); if ((s = gwy_flat_enum_to_string(header->data_source, G_N_ELEMENTS(data_sources), data_sources, data_sources_name))) format_meta(meta, "Data source", "%s", s); format_meta(meta, "Direction", header->forward ? "Forward" : "Backward"); format_bit(meta, "Measurement signal", G_N_ELEMENTS(measurement_signals), measurement_signals, measurement_signals_name, header->spm_misc_param.measurement_signal); format_bit(meta, "SPM mode", G_N_ELEMENTS(spm_modes), spm_modes, spm_modes_name, header->spm_misc_param.spm_mode); format_bit(meta, "AFM mode", G_N_ELEMENTS(afm_modes), afm_modes, afm_modes_name, header->spm_misc_param.afm_mode); return meta; }