static GwyGraphModel* spectra_to_graph(GwySpectra *spectra) { GwyGraphModel *gmodel; const gchar* graph_title; GwyGraphCurveModel *cmodel; gchar *curve_title = NULL; guint j, k, n_spectra, n_points; GwyDataLine *dline; gdouble *data, *xdata, *ydata, x_offset, x_realsize; GwySIUnit *x_si_unit, *y_si_unit; if (!(n_spectra = gwy_spectra_get_n_spectra(spectra))) { gwy_debug("rhk-spm32: no spectra in rhkpage - something is odd\n"); return NULL; } dline = gwy_spectra_get_spectrum(spectra, 0); n_points = gwy_data_line_get_res(dline); x_si_unit = gwy_data_line_get_si_unit_x(dline); y_si_unit = gwy_data_line_get_si_unit_y(dline); xdata = g_new0(gdouble, n_points); ydata = g_new0(gdouble, n_points); x_offset = gwy_data_line_get_offset(dline); x_realsize = gwy_data_line_get_real(dline); for (j = 0; j < n_points; j++) xdata[j] = x_offset+j*x_realsize; gmodel = gwy_graph_model_new(); g_object_set(gmodel, "si-unit-x", x_si_unit, "si-unit-y", y_si_unit, NULL); graph_title = gwy_spectra_get_title(spectra); g_object_set(gmodel, "title", graph_title, NULL); // tends to obstruct the curves - if there are more than a few - not // good - makes it hard to grab curves? //g_object_set(gmodel, "label-visible", FALSE, NULL); for (k = 1; k <= n_spectra; k++) { dline = gwy_spectra_get_spectrum(spectra, k-1); data = gwy_data_line_get_data(dline); for (j = 0; j < n_points; j++) ydata[j] = data[j]; cmodel = gwy_graph_curve_model_new(); gwy_graph_model_add_curve(gmodel, cmodel); g_object_unref(cmodel); curve_title = g_strdup_printf("%s %d", graph_title, k); g_object_set(cmodel, "description", curve_title, "mode", GWY_GRAPH_CURVE_LINE, "color", gwy_graph_get_preset_color(k), NULL); gwy_graph_curve_model_set_data(cmodel, xdata, ydata, n_points); } g_free(ydata); g_free(xdata); return gmodel; }
static GwyContainer* omicron_load(const gchar *filename, G_GNUC_UNUSED GwyRunType mode, GError **error) { OmicronFile ofile; GwyContainer *container = NULL, *meta; gchar *text = NULL; GError *err = NULL; GwyDataField *dfield = NULL; GwySpectra *spectra = NULL; gchar key[32]; guint i; /* @text must not be destroyed while @ofile is still in used because * all strings are only references there */ if (!g_file_get_contents(filename, &text, NULL, &err)) { err_GET_FILE_CONTENTS(error, &err); return NULL; } gwy_clear(&ofile, 1); ofile.filename = filename; if (!omicron_read_header(text, &ofile, error)) goto fail; if (!ofile.topo_channels || !ofile.topo_channels->len) { err_NO_DATA(error); goto fail; } container = gwy_container_new(); /* First Load the Topographic Data */ for (i = 0; i < ofile.topo_channels->len; i++) { OmicronTopoChannel *channel; channel = g_ptr_array_index(ofile.topo_channels, i); dfield = omicron_read_data(&ofile, channel, error); if (!dfield) { gwy_object_unref(container); goto fail; } g_snprintf(key, sizeof(key), "/%u/data", i); gwy_container_set_object_by_name(container, key, dfield); g_object_unref(dfield); if (channel->name) { gchar *s; g_snprintf(key, sizeof(key), "/%u/data/title", i); if (channel->scandir == SCAN_FORWARD) s = g_strdup_printf("%s (Forward)", channel->name); else if (channel->scandir == SCAN_BACKWARD) s = g_strdup_printf("%s (Backward)", channel->name); else s = g_strdup(channel->name); gwy_container_set_string_by_name(container, key, s); } if ((meta = omicron_make_meta(&ofile))) { g_snprintf(key, sizeof(key), "/%u/meta", i); gwy_container_set_object_by_name(container, key, meta); g_object_unref(meta); } } /* Then load the spectroscopy data. */ /* * There are two types of spectroscopy file: * * a) Single Point Spectroscopy Files * Single point which is stored by SCALA as an ascii file. Any number of * single point spectrums may be aquired, but the number is normally * quite small. These files are identified by their filename *.cs[0..3] * * b) Binary Spectroscopy Files * When large numbers of spectra are aquired on a regular grid they are * stored in BE binary. These data are aquired during the scan, and so * can be aquired during the forward scan or the backward scan. * * Forwards scan files can be indentified from their filename *.sf[0..3] * Backward scan files can be indentified from their filename *.sb[0..3] */ if (ofile.spectro_channels) { for (i = 0; i < ofile.spectro_channels->len; i++) { OmicronSpectroChannel *channel; channel = g_ptr_array_index(ofile.spectro_channels, i); if (omicron_has_extension(channel->filename, "cs")) { gchar *t; GQuark quark; spectra = omicron_read_cs_data(&ofile, channel, error); if (!spectra) { gwy_object_unref(container); goto fail; } if (!gwy_spectra_get_n_spectra(spectra)) { gwy_debug("Spectra %u is empty, ignoring", i); g_object_unref(spectra); continue; } /* FIXME */ t = g_strconcat(channel->chan, "-", channel->param, NULL); gwy_spectra_set_title(spectra, t); g_free(t); quark = gwy_app_get_spectra_key_for_id(i); gwy_container_set_object(container, quark, spectra); g_object_unref(spectra); } else if (omicron_has_extension(channel->filename, "sf") || omicron_has_extension(channel->filename, "sb")) { /* FIXME */ } else { g_warning("Cannot determine spectra type of %s", channel->filename); } } } fail: omicron_file_free(&ofile); g_free(text); return container; }