123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- #include <ufo/ufo.h>
- #include <stdlib.h>
- #include "piv-scheduler.h"
- #include "piv-nodes.h"
- #include "piv-ufo-base.h"
- static void
- check_error (GError *error)
- {
- if (error != NULL) {
- g_print ("Error reading configuration: %s\n", error->message);
- exit (1);
- }
- }
- int
- main (int argc, char *argv[])
- {
- struct piv_nodes piv;
- struct piv_ufo_base piv_base;
- GOptionContext *context;
- GKeyFile *key_file;
- GError *error = NULL;
- static gchar *key_file_name = NULL;
- static GOptionEntry entries[] = {
- { "config", 'c', 0, G_OPTION_ARG_STRING, &key_file_name, "Configuration file name (default piv.cfg)", "FILE" },
- { NULL }
- };
- #if !(GLIB_CHECK_VERSION (2, 36, 0))
- g_type_init ();
- #endif
- context = g_option_context_new (NULL);
- g_option_context_add_main_entries (context, entries, NULL);
- if (!g_option_context_parse (context, &argc, &argv, &error)) {
- g_print ("Failed parsing arguments: %s\n", error->message);
- return 1;
- }
- if (!key_file_name)
- key_file_name = "piv.cfg";
- piv_ufo_base_init(&piv_base);
- piv_nodes_init(&piv, &piv_base);
- if (piv_base.error)
- g_print ("Error %s\n", piv_base.error->message);
- key_file = g_key_file_new ();
- if (!g_key_file_load_from_file (key_file, key_file_name, G_KEY_FILE_NONE, &error)) {
- g_print ("Error loading `%s': %s", key_file_name, error->message);
- return 1;
- }
- /*********************/
- /* CONFIGURATION *****/
- /*********************/
- UfoTaskNode *global_reader;
- global_reader = ufo_plugin_manager_get_task (piv_base.manager, "read", &piv_base.error);
- gchar *input_path = g_key_file_get_string (key_file, "input", "path", &error);
- check_error (error);
- guint scale = (guint) g_key_file_get_integer (key_file, "input", "scale", &error);
- check_error (error);
- g_object_set (G_OBJECT (global_reader), "path", input_path, NULL);
- g_object_set (G_OBJECT (piv.writer), "filename", "res%i.tif", NULL);
- g_object_set (G_OBJECT (piv.ringwriter), "filename", "results", NULL);
- g_object_set (G_OBJECT (piv.denoise), "matrix_size",
- g_key_file_get_integer (key_file, "input", "matrix_size", &error) / scale, NULL);
- check_error (error);
- g_object_set (G_OBJECT (piv.contrast), "remove_high",
- g_key_file_get_boolean (key_file, "input", "remove_high_intensity_pixels", &error), NULL);
- check_error (error);
- guint ring_start = ((guint) g_key_file_get_integer (key_file, "ring", "start", &error)) / scale;
- check_error (error);
- guint ring_end = ((guint) g_key_file_get_integer (key_file, "ring", "end", &error)) / scale;
- check_error (error);
- guint ring_step = ((guint) g_key_file_get_integer (key_file, "ring", "step", &error)) / scale;
- check_error (error);
- g_object_set (G_OBJECT (piv.ring_pattern),
- "ring_start", ring_start,
- "ring_end", ring_end,
- "ring_step", ring_step, NULL);
- g_object_set (G_OBJECT (piv.ring_pattern), "ring_thickness",
- g_key_file_get_integer (key_file, "ring", "thickness", &error) / scale, NULL);
- check_error (error);
- g_object_set (G_OBJECT (piv.ring_pattern), "width",
- g_key_file_get_integer (key_file, "ring", "width", &error) / scale, NULL);
- check_error (error);
- g_object_set (G_OBJECT (piv.ring_pattern), "height",
- g_key_file_get_integer (key_file, "ring", "height", &error) / scale, NULL);
- check_error (error);
- g_object_set (G_OBJECT (piv.ringwriter), "scale", scale, NULL);
- g_object_set (G_OBJECT (piv.fft), "dimensions", 2, NULL);
- g_object_set (G_OBJECT (piv.ifft), "dimensions", 2, NULL);
- g_object_set (G_OBJECT (piv.ringfft), "dimensions", 2, NULL);
- g_object_set (G_OBJECT (piv.ringifft), "dimensions", 2, NULL);
- /* Give ring scale, when image is reduced by two, then scale should be 2 */
- g_object_set (G_OBJECT (piv.dump_ring), "scale", scale, NULL);
- /* Does not need user configuration */
- guint number_of_rings = (ring_end - ring_start) / ring_step + 1;
- g_object_set (G_OBJECT (piv.duplicater), "dup_count", number_of_rings, NULL);
- g_object_set (G_OBJECT (piv.concatenate_result), "ring_count", number_of_rings, NULL);
- g_object_set (G_OBJECT (piv.loop_ringfft), "loop", 1, NULL);
- g_object_set (G_OBJECT (piv.loop_ringfft), "dup_count",
- g_key_file_get_integer (key_file, "input", "num_images", &error), NULL);
- check_error (error);
- g_object_set (G_OBJECT (piv.concatenate_result), "max_count",
- g_key_file_get_integer (key_file, "ring", "max_count", &error), NULL);
- check_error (error);
- g_object_set (G_OBJECT (piv.filter_particle), "min",
- g_key_file_get_double (key_file, "filter", "min", &error), NULL);
- check_error (error);
- g_object_set (G_OBJECT (piv.filter_particle), "threshold",
- g_key_file_get_double (key_file, "filter", "threshold", &error), NULL);
- check_error (error);
- g_object_set (G_OBJECT (piv.get_dup_circ), "threshold",
- g_key_file_get_double (key_file, "dup", "threshold", &error) / scale, NULL);
- check_error (error);
- g_object_set (G_OBJECT (piv.remove_circle), "threshold",
- g_key_file_get_double (key_file, "remove", "threshold", &error) / scale, NULL);
- check_error (error);
- g_object_set (G_OBJECT (piv.multi_search), "radii_range",
- g_key_file_get_integer (key_file, "radii", "range", &error) / scale, NULL);
- check_error (error);
- g_object_set (G_OBJECT (piv.multi_search), "threshold",
- g_key_file_get_double (key_file, "radii", "threshold", &error), NULL);
- check_error (error);
- g_object_set (G_OBJECT (piv.multi_search), "displacement",
- g_key_file_get_integer (key_file, "radii", "displacement", &error) / scale, NULL);
- check_error (error);
- /*********************/
- /* GRAPH SETUP *******/
- /*********************/
- GList* piv_nodes = NULL;
- GList* it = piv_base.gpu_nodes;
- if (!it) {
- g_print("Main : No GPUs found\n");
- return 1;
- }
- g_print("Main : Connecting nodes %p\n", it->data);
- piv_nodes_set_gpu(&piv, it->data);
- piv_nodes = g_list_append(piv_nodes, &piv);
- piv_ufo_base_connect (&piv_base, &piv, scale,
- g_key_file_get_boolean (key_file, "output", "dump_ring_to_image", &error), global_reader);
- check_error (error);
- // Graph expansion for usage of multiple GPUs. Uncomment lines when UFO
- // supports calling plug-ins on demand
- //for (it = it->next; it; it = it->next) {
- // g_print("Main : Connecting nodes %p\n", it->data);
- // struct piv_nodes *cpy = piv_nodes_copy(&piv);
- // piv_nodes = g_list_append(piv_nodes, cpy);
- // piv_nodes_set_gpu(cpy, it->data);
- // piv_ufo_base_connect(&piv_base, cpy, scale, dump_ring_to_image, global_reader);
- //}
- ufo_base_scheduler_run(piv_base.scheduler, piv_base.graph, &piv_base.error);
- if (piv_base.error)
- g_print("Error %s\n", piv_base.error->message);
- /*********************/
- /* CLEANUP ***********/
- /*********************/
- piv_ufo_base_unref(&piv_base);
- for (it = piv_nodes; it; it = it->next)
- piv_nodes_unref(it->data);
- g_object_unref (global_reader);
- g_option_context_free (context);
- g_key_file_free (key_file);
- return 0;
- }
|