[med-svn] [SCM] aghermann branch, master, updated. 4f7a3b774136ffffbaf9b05d90bd568347bc5461

andrei zavada johnhommer at gmail.com
Fri Nov 16 00:50:22 UTC 2012


The following commit has been merged in the master branch:
commit ea27e3a696aceed93d6888db41255792ffb1c722
Author: andrei zavada <johnhommer at gmail.com>
Date:   Fri Oct 19 15:19:08 2012 +0300

    ICM

diff --git a/src/ui/Makefile.am b/src/ui/Makefile.am
index bc8f970..025eccc 100644
--- a/src/ui/Makefile.am
+++ b/src/ui/Makefile.am
@@ -23,6 +23,7 @@ libaghui_a_SOURCES = \
 	ed.cc \
 	ed_cb.cc \
 	ed-construct.cc \
+	ed-populate.cc \
 	ed-measurements.cc \
 	ed-measurements_cb.cc \
 	ed-loadsave.cc \
diff --git a/src/ui/ed-loadsave.cc b/src/ui/ed-loadsave.cc
index 21dfc91..2f83319 100644
--- a/src/ui/ed-loadsave.cc
+++ b/src/ui/ed-loadsave.cc
@@ -147,7 +147,7 @@ aghui::SExpDesignUI::load_settings()
 	// pagesize and binsize not loaded, so their _saved counterparts saved in ctor
 
       // misc
-	__adjust_op_freq_spinbuttons();
+	adjust_op_freq_spinbuttons();
 
 	return 0;
 }
diff --git a/src/ui/ed-populate.cc b/src/ui/ed-populate.cc
new file mode 100644
index 0000000..eac4d1a
--- /dev/null
+++ b/src/ui/ed-populate.cc
@@ -0,0 +1,532 @@
+// ;-*-C++-*-
+/*
+ *       File name:  ui/ed-populate.cc
+ *         Project:  Aghermann
+ *          Author:  Andrei Zavada <johnhommer at gmail.com>
+ * Initial version:  2012-10-19
+ *
+ *         Purpose:  measurements overview view
+ *
+ *         License:  GPL
+ */
+
+
+#include <cstring>
+
+#include "../expdesign/primaries.hh"
+#include "../model/beersma.hh"
+#include "misc.hh"
+#include "ed.hh"
+#include "ed_cb.hh"
+
+using namespace std;
+
+using namespace aghui;
+
+
+int
+aghui::SExpDesignUI::
+populate( bool do_load)
+{
+	printf( "\nSExpDesignUI::populate():\n");
+	AghDD = ED->enumerate_sessions();
+	_AghDi = AghDD.begin();
+	AghGG = ED->enumerate_groups();
+	_AghGi = AghGG.begin();
+	AghHH = ED->enumerate_all_channels();
+	_AghHi = AghHH.begin();
+	AghTT = ED->enumerate_eeg_channels();
+	_AghTi = AghTT.begin();
+	AghEE = ED->enumerate_episodes();
+	_AghEi = AghEE.begin();
+
+	printf( "*     Sessions: %s\n"
+		"*       Groups: %s\n"
+		"* All Channels: %s\n"
+		"* EEG Channels: %s\n"
+		"*     Episodes: %s\n",
+		agh::str::join( AghDD, "; ").c_str(),
+		agh::str::join( AghGG, "; ").c_str(),
+		agh::str::join( AghHH, "; ").c_str(),
+		agh::str::join( AghTT, "; ").c_str(),
+		agh::str::join( AghEE, "; ").c_str());
+
+	used_samplerates =
+		ED->used_samplerates();
+	used_eeg_samplerates =
+		ED->used_samplerates( sigfile::SChannel::TType::eeg);
+	if ( used_eeg_samplerates.size() == 1 )
+		printf( "* single common EEG samplerate: %zu\n", used_eeg_samplerates.front());
+	else
+		printf( "* multiple EEG samplerates (%zu)\n", used_eeg_samplerates.size());
+
+	if ( do_load ) {
+		if ( load_settings() )
+			fprintf( stderr, "load_settings() had issues\n");
+		if ( geometry.w > 0 ) {// implies the rest are, too
+			// gtk_window_parse_geometry( wMainWindow, _geometry_placeholder.c_str());
+			gtk_window_move( wMainWindow, geometry.x, geometry.y);
+			gtk_window_resize( wMainWindow, geometry.w, geometry.h);
+		}
+	}
+
+	gtk_window_set_title( wMainWindow,
+			      (string ("Aghermann: ") + agh::str::homedir2tilda( ED->session_dir())).c_str());
+	if ( last_used_version != VERSION ) {
+		printf( "Upgrading from version %s, here's ChangeLog for you\n", last_used_version.c_str());
+		show_changelog();
+		last_used_version = VERSION;
+	}
+
+	snprintf_buf( "Smooth: %zu", smooth_profile);
+	gtk_button_set_label( (GtkButton*)eMsmtProfileSmooth, __buf__);
+
+	if ( AghTT.empty() )
+		aghui::pop_ok_message( wMainWindow,
+				       "No EEG channels",
+				       "There are no EEG channels found in any recordings in the tree.");
+	if ( AghTT.empty() or AghGG.empty() ) {
+		show_empty_experiment_blurb();
+		gtk_widget_set_visible( (GtkWidget*)lTaskSelector2, FALSE);
+		gtk_widget_set_visible( (GtkWidget*)cMsmtMainToolbar, FALSE);
+		gtk_widget_set_visible( gtk_notebook_get_nth_page( tTaskSelector, 1), FALSE);
+	} else {
+		populate_mChannels();
+		populate_mSessions();
+		populate_mGlobalAnnotations();
+		populate_mGlobalADProfiles();
+		populate_1();
+
+		if ( display_profile_type == sigfile::TMetricType::Psd ) {
+			gtk_combo_box_set_active( eMsmtProfileType, 0);
+			gtk_widget_set_visible( (GtkWidget*)cMsmtProfileParams2, FALSE);
+			gtk_widget_set_visible( (GtkWidget*)cMsmtProfileParams1, TRUE);
+			gtk_widget_grab_focus( (GtkWidget*)eMsmtOpFreqFrom);
+		} else {
+			gtk_combo_box_set_active( eMsmtProfileType, 1);
+			gtk_widget_set_visible( (GtkWidget*)cMsmtProfileParams1, FALSE);
+			gtk_widget_set_visible( (GtkWidget*)cMsmtProfileParams2, TRUE);
+		}
+
+		gtk_widget_set_visible( (GtkWidget*)lTaskSelector2, TRUE);
+		gtk_widget_set_visible( (GtkWidget*)cMsmtMainToolbar, TRUE);
+		gtk_widget_set_visible( gtk_notebook_get_nth_page( tTaskSelector, 1), TRUE);
+	}
+
+	if ( not ED->error_log().empty() ) {
+		gtk_text_buffer_set_text( gtk_text_view_get_buffer( tScanLog),
+					  ED->error_log().c_str(), -1);
+		gtk_widget_show_all( (GtkWidget*)wScanLog);
+	}
+
+	return 0;
+}
+
+
+void
+aghui::SExpDesignUI::
+depopulate( bool do_save)
+{
+	if ( do_save )
+		save_settings();
+
+	ED->reset_error_log();
+
+	// these are freed on demand immediately before reuse; leave them alone
+	AghGG.clear();
+	AghDD.clear();
+	AghEE.clear();
+	AghHH.clear();
+	AghTT.clear();
+
+	g_signal_handler_block( eMsmtSession, eMsmtSession_changed_cb_handler_id);
+	g_signal_handler_block( eMsmtChannel, eMsmtChannel_changed_cb_handler_id);
+
+	gtk_list_store_clear( mSessions);
+	gtk_list_store_clear( mAllChannels);
+	gtk_list_store_clear( mEEGChannels);
+	gtk_tree_store_clear( mGlobalAnnotations);
+	gtk_list_store_clear( mGlobalADProfiles);
+
+	__reconnect_sessions_combo();
+	g_signal_handler_unblock( eMsmtSession, eMsmtSession_changed_cb_handler_id);
+	__reconnect_channels_combo();
+	g_signal_handler_unblock( eMsmtChannel, eMsmtChannel_changed_cb_handler_id);
+}
+
+
+
+
+
+void
+aghui::SExpDesignUI::
+populate_mSessions()
+{
+	g_signal_handler_block( eMsmtSession, eMsmtSession_changed_cb_handler_id);
+	gtk_list_store_clear( mSessions);
+	GtkTreeIter iter;
+	for ( auto &D : AghDD ) {
+		gtk_list_store_append( mSessions, &iter);
+		gtk_list_store_set( mSessions, &iter,
+				    0, D.c_str(),
+				    -1);
+	}
+	__reconnect_sessions_combo();
+	g_signal_handler_unblock( eMsmtSession, eMsmtSession_changed_cb_handler_id);
+}
+
+
+
+
+
+
+void
+aghui::SExpDesignUI::
+populate_mChannels()
+{
+	g_signal_handler_block( eMsmtChannel, eMsmtChannel_changed_cb_handler_id);
+	gtk_list_store_clear( mEEGChannels);
+	gtk_list_store_clear( mAllChannels);
+	// users of mAllChannels (SF pattern) connect to model dynamically
+
+	for ( auto &H : AghTT ) {
+		GtkTreeIter iter;
+		gtk_list_store_append( mEEGChannels, &iter);
+		gtk_list_store_set( mEEGChannels, &iter,
+				    0, H.c_str(),
+				    -1);
+	}
+
+	for ( auto &H : AghHH ) {
+		GtkTreeIter iter;
+		gtk_list_store_append( mAllChannels, &iter);
+		gtk_list_store_set( mAllChannels, &iter,
+				    0, H.c_str(),
+				    -1);
+	}
+
+	__reconnect_channels_combo();
+	g_signal_handler_unblock( eMsmtChannel, eMsmtChannel_changed_cb_handler_id);
+}
+
+
+
+
+
+void
+aghui::SExpDesignUI::
+__reconnect_channels_combo()
+{
+	gtk_combo_box_set_model( eMsmtChannel, (GtkTreeModel*)mEEGChannels);
+
+	if ( !AghTT.empty() ) {
+		int Ti = AghTi();
+		if ( Ti != -1 )
+			gtk_combo_box_set_active( eMsmtChannel, Ti);
+		else
+			gtk_combo_box_set_active( eMsmtChannel, 0);
+	}
+}
+
+
+void
+aghui::SExpDesignUI::
+__reconnect_sessions_combo()
+{
+	gtk_combo_box_set_model( eMsmtSession, (GtkTreeModel*)mSessions);
+
+	if ( !AghDD.empty() ) {
+		int Di = AghDi();
+		if ( Di != -1 )
+			gtk_combo_box_set_active( eMsmtSession, Di);
+		else
+			gtk_combo_box_set_active( eMsmtSession, 0);
+	}
+}
+
+
+
+
+void
+aghui::SExpDesignUI::
+populate_mGlobalAnnotations()
+{
+	gtk_tree_store_clear( mGlobalAnnotations);
+      // apart from tree store, also refresh global list
+	global_annotations.clear();
+
+	GtkTreeIter
+		iter_g, iter_j, iter_d, iter_e, iter_a;
+	const char
+		*last_g = NULL, *last_j = NULL, *last_d = NULL, *last_e = NULL;
+
+	for ( auto &G : ED->groups ) {
+		for ( auto &J : G.second ) {
+			for ( auto &D : J.measurements ) {
+				for ( auto &E : D.second.episodes ) {
+					auto annotations = E.get_annotations();
+					if ( annotations.size() > 0 ) {
+						if ( last_g != G.first.c_str() ) {
+							gtk_tree_store_append( mGlobalAnnotations, &iter_g, NULL);
+							gtk_tree_store_set( mGlobalAnnotations, &iter_g,
+									    0, G.first.c_str(),
+									    mannotations_visibility_switch_col, TRUE,
+									    -1);
+							last_j = last_d = last_e = NULL;
+						}
+						if ( last_j != J.name() ) {
+							gtk_tree_store_append( mGlobalAnnotations, &iter_j, &iter_g);
+							gtk_tree_store_set( mGlobalAnnotations, &iter_j,
+									    0, last_j = J.name(),
+									    mannotations_visibility_switch_col, TRUE,
+									    -1);
+							last_d = last_e = NULL;
+						}
+						if ( last_d != D.first.c_str() ) {
+							gtk_tree_store_append( mGlobalAnnotations, &iter_d, &iter_j);
+							gtk_tree_store_set( mGlobalAnnotations, &iter_d,
+									    0, last_d = D.first.c_str(),
+									    mannotations_visibility_switch_col, TRUE,
+									    -1);
+							last_e = NULL;
+						}
+						if ( last_e != E.name() ) {
+							gtk_tree_store_append( mGlobalAnnotations, &iter_e, &iter_d);
+							gtk_tree_store_set( mGlobalAnnotations, &iter_e,
+									    0, last_e = E.name(),
+									    mannotations_visibility_switch_col, TRUE,
+									    -1);
+						}
+						for ( auto &A : annotations ) {
+
+							global_annotations.emplace_front( J, D.first, E, A);
+
+							auto pages = A.page_span( pagesize()) * 1u;
+							if ( pages.a == pages.z )
+								snprintf_buf( "%u", pages.a + 1);
+							else
+								snprintf_buf( "%u-%u", pages.a + 1, pages.z + 1);
+							gtk_tree_store_append( mGlobalAnnotations, &iter_a, &iter_e);
+							gtk_tree_store_set( mGlobalAnnotations, &iter_a,
+									    1, __buf__,
+									    2, A.channel(),
+									    3, A.label.c_str(),
+									    mannotations_ref_col, (gpointer)&global_annotations.front(),
+									    mannotations_visibility_switch_col, TRUE,
+									    -1);
+						}
+					}
+				}
+			}
+		}
+	}
+	gtk_tree_view_expand_all( tvGlobalAnnotations);
+}
+
+
+
+void
+aghui::SExpDesignUI::
+populate_mGlobalADProfiles()
+{
+	gtk_list_store_clear( mGlobalADProfiles);
+	for ( auto &P : global_artifact_detection_profiles ) {
+		GtkTreeIter iter;
+		gtk_list_store_append( mEEGChannels, &iter);
+		gtk_list_store_set( mEEGChannels, &iter,
+				    0, P.first.c_str(),
+				    -1);
+	}
+}
+
+
+
+void
+aghui::SExpDesignUI::
+populate_1()
+{
+	if ( ED->groups.empty() )
+		return;
+
+      // touch toolbar controls
+	suppress_redraw = true;
+	gtk_spin_button_set_value( eMsmtOpFreqFrom, operating_range_from);
+	gtk_spin_button_set_value( eMsmtOpFreqWidth, operating_range_upto - operating_range_from);
+
+      // deal with the main drawing area
+	groups.clear();
+	gtk_container_foreach( (GtkContainer*)cMeasurements,
+			       (GtkCallback)gtk_widget_destroy,
+			       NULL);
+
+	printf( "SExpDesignUI::populate_1(): session \"%s\", channel \"%s\"\n", AghD(), AghT());
+
+	time_t	earliest_start = (time_t)-1,
+		latest_end = (time_t)-1;
+      // first pass: (1) create SSubjectPresentation's
+      //             (2) determine common timeline
+	for ( auto Gi = ED->groups.begin(); Gi != ED->groups.end(); ++Gi ) {
+		groups.emplace_back( Gi, *this); // precisely need the iterator, not object by reference
+		SGroupPresentation& Gp = groups.back();
+		for ( auto &J : Gi->second ) {
+			Gp.emplace_back( J, Gp);
+			const SSubjectPresentation& j = Gp.back();
+			if ( j.cscourse && J.have_session(*_AghDi) ) {
+				auto& ee = J.measurements[*_AghDi].episodes;
+				if ( not ee.empty() ) {
+					// (2)
+					if ( earliest_start == (time_t)-1 || earliest_start > ee.front().start_rel )
+						earliest_start = ee.front().start_rel;
+					if ( latest_end == (time_t)-1 || latest_end < ee.back().end_rel )
+						latest_end = ee.back().end_rel;
+				} else
+					fprintf( stderr, "SExpDesignUI::populate_1(): session \"%s\", channel \"%s\" for subject \"%s\" is empty\n",
+						 AghD(), AghT(), J.name());
+			}
+		}
+	}
+
+	timeline_start = earliest_start;
+	timeline_end   = latest_end;
+	timeline_width = (timeline_end - timeline_start) / 3600 * timeline_pph;
+	timeline_pages = (timeline_end - timeline_start) / ED->fft_params.pagesize;
+
+	if ( profile_scale_psd == 0. || profile_scale_mc == 0. ) // not previously saved
+		calculate_profile_scale();
+
+	printf( "SExpDesignUI::populate_1(): common timeline:\n");
+	fputs( asctime( localtime(&earliest_start)), stderr);
+	fputs( asctime( localtime(&latest_end)), stderr);
+
+	tl_left_margin = tl_right_margin = 0;
+
+      // walk again thoroughly, set timeline drawing area length
+	for ( auto &G : groups ) {
+	      // convert avg episode times
+		g_string_assign( __ss__, "");
+		for ( auto &E : AghEE ) {
+			pair<float, float>& avge = G.group().avg_episode_times[*_AghDi][E];
+			unsigned seconds, h0, m0, s0, h9, m9, s9;
+			seconds = avge.first * 24 * 60 * 60;
+			h0 = seconds / 60 / 60;
+			m0  = seconds % 3600 / 60;
+			s0  = seconds % 60;
+			seconds = avge.second * 24 * 60 * 60;
+			h9 = seconds / 60 / 60;
+			m9  = seconds % 3600 / 60;
+			s9  = seconds % 60;
+
+			g_string_append_printf( __ss__,
+						"       <i>%s</i> %02d:%02d:%02d ~ %02d:%02d:%02d",
+						E.c_str(),
+						h0 % 24, m0, s0,
+						h9 % 24, m9, s9);
+		}
+
+		gchar *g_escaped = g_markup_escape_text( G.name(), -1);
+		snprintf_buf( "<b>%s</b> (%zu) %s", g_escaped, G.size(), __ss__->str);
+		g_free( g_escaped);
+
+		G.expander = (GtkExpander*)gtk_expander_new( __buf__);
+		gtk_expander_set_use_markup( G.expander, TRUE);
+		g_object_set( (GObject*)G.expander,
+			      "visible", TRUE,
+			      "expanded", TRUE,
+			      "height-request", -1,
+			      NULL);
+		gtk_box_pack_start( (GtkBox*)cMeasurements,
+				    (GtkWidget*)G.expander, FALSE, TRUE, 3);
+		gtk_container_add( (GtkContainer*)G.expander,
+				   (GtkWidget*) (G.vbox = (GtkExpander*)gtk_box_new( GTK_ORIENTATION_VERTICAL, 1)));
+		g_object_set( (GObject*)G.vbox,
+			      "height-request", -1,
+			      NULL);
+
+		for ( auto &J : G ) {
+			J.da = gtk_drawing_area_new();
+			gtk_box_pack_start( (GtkBox*)G.vbox,
+					    J.da, TRUE, TRUE, 2);
+
+			// determine tl_left_margin
+			{
+				cairo_t *cr = gdk_cairo_create( gtk_widget_get_window( J.da));
+				cairo_text_extents_t extents;
+				cairo_select_font_face( cr, "serif", CAIRO_FONT_SLANT_ITALIC, CAIRO_FONT_WEIGHT_BOLD);
+				cairo_set_font_size( cr, 11);
+				cairo_text_extents( cr, J.csubject.name(), &extents);
+				if ( tl_left_margin < extents.width )
+					tl_left_margin = extents.width;
+				cairo_destroy( cr);
+			}
+
+			gtk_widget_add_events( J.da,
+					       (GdkEventMask)
+					       GDK_EXPOSURE_MASK |
+					       GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
+					       GDK_SCROLL_MASK |
+					       GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK |
+					       GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK |
+					       GDK_POINTER_MOTION_MASK);
+			g_signal_connect( J.da, "draw",
+					  (GCallback)daSubjectTimeline_draw_cb,
+					  &J);
+			g_signal_connect( J.da, "enter-notify-event",
+					  (GCallback)daSubjectTimeline_enter_notify_event_cb,
+					  &J);
+			g_signal_connect( J.da, "leave-notify-event",
+					  (GCallback)daSubjectTimeline_leave_notify_event_cb,
+					  &J);
+			g_signal_connect( J.da, "scroll-event",
+					  (GCallback)daSubjectTimeline_scroll_event_cb,
+					  &J);
+			g_signal_connect( J.da, "button-press-event",
+					  (GCallback)daSubjectTimeline_button_press_event_cb,
+					  &J);
+			g_signal_connect( J.da, "motion-notify-event",
+					  (GCallback)daSubjectTimeline_motion_notify_event_cb,
+					  &J);
+
+			g_signal_connect( J.da, "drag-data-received",
+					  (GCallback)common_drag_data_received_cb,
+					  this);
+			g_signal_connect( J.da, "drag-drop",
+					  (GCallback)common_drag_drop_cb,
+					  this);
+			gtk_drag_dest_set( J.da, GTK_DEST_DEFAULT_ALL,
+					   NULL, 0, GDK_ACTION_COPY);
+			gtk_drag_dest_add_uri_targets( J.da);
+		}
+	}
+
+      // walk quickly one last time to set widget attributes (importantly, involving tl_left_margin)
+	tl_left_margin += 10;
+	for ( auto &G : groups )
+		for ( auto &J : G )
+			g_object_set( (GObject*)J.da,
+				      "can-focus", TRUE,
+				      "app-paintable", TRUE,
+				      "height-request", timeline_height,
+				      "width-request", timeline_width + tl_left_margin + tl_right_margin,
+				      NULL);
+
+	snprintf_buf( "<small>%zusec/%gHz/%s</small>",
+		      ED->fft_params.pagesize,
+		      ED->fft_params.binsize,
+		      sigfile::SFFTParamSet::welch_window_type_name( ED->fft_params.welch_window_type));
+	gtk_label_set_markup( lMsmtPSDInfo, __buf__);
+
+	snprintf_buf( "<small>%gHz/%g/%g</small>",
+		      ED->mc_params.bandwidth,
+		      ED->mc_params.iir_backpolate,
+		      ED->mc_params.mc_gain);
+	gtk_label_set_markup( lMsmtMCInfo, __buf__);
+
+	suppress_redraw = false;
+//	set_cursor_busy( false, (GtkWidget*)wMainWindow);
+	gtk_widget_show_all( (GtkWidget*)(cMeasurements));
+}
+
+
+
+
+// eof
diff --git a/src/ui/ed-settings_cb.cc b/src/ui/ed-settings_cb.cc
index dfa1b25..ec0c96c 100644
--- a/src/ui/ed-settings_cb.cc
+++ b/src/ui/ed-settings_cb.cc
@@ -53,7 +53,7 @@ tDesign_switch_page_cb( GtkNotebook*, gpointer, guint page_num, gpointer userdat
 			ED.ED->mc_params.reset();
 		}
 
-		ED.__adjust_op_freq_spinbuttons();
+		ED.adjust_op_freq_spinbuttons();
 
 	      // scan as necessary
 		if ( ED.pagesize_item_saved	  		!= ED.pagesize_item ||
diff --git a/src/ui/ed.cc b/src/ui/ed.cc
index cde1767..a3863ee 100644
--- a/src/ui/ed.cc
+++ b/src/ui/ed.cc
@@ -15,8 +15,6 @@
 #include <ctime>
 #include <functional>
 
-#include <cairo.h>
-#include <cairo-svg.h>
 //#include <vte/vte.h>
 
 #include "../common/config-validate.hh"
@@ -187,6 +185,8 @@ SExpDesignUI (aghui::SSessionChooser *parent,
 	ED = new agh::CExpDesign (dir,
 				  bind( &SExpDesignUI::sb_main_progress_indicator, this,
 					placeholders::_1, placeholders::_2, placeholders::_3));
+	load_artifact_detection_profiles();
+
 	nodestroy_by_cb = false;
 
 	// bind fields to widgets
@@ -253,6 +253,65 @@ SExpDesignUI (aghui::SSessionChooser *parent,
 	set_wMainWindow_interactive( true);
 }
 
+void
+aghui::SExpDesignUI::
+load_artifact_detection_profiles()
+{
+	FILE *domien = fopen( (ED->session_dir() + "/.AD_profiles").c_str(), "r");
+	if ( domien ) {
+		while ( !feof (domien) ) {
+			SDetectArtifactsParamPack P;
+			char *_ = NULL;
+			getline( &_, NULL, domien);
+			fscanf( domien, "%la  %la %la  %la %la %la  %la %la  %la %la %la "
+				"%zu %zu %d %d\n",
+				&P.scope,
+				&P.upper_thr, &P.lower_thr,
+				&P.f0, &P.fc, &P.bandwidth,
+				&P.mc_gain, &P.iir_backpolate,
+				&P.E, &P.dmin, &P.dmax,
+				&P.sssu_hist_size,
+				&P.smooth_side,
+				&P.estimate_E,
+				&P.use_range);
+			global_artifact_detection_profiles[_] = P;
+			free( _);
+		}
+		fclose( domien);
+	} else
+		fprintf( stderr, "failed to open $EXPROOT/.AD_profiles for reading\n");
+}
+
+void
+aghui::SExpDesignUI::
+save_artifact_detection_profiles() const
+{
+	// libconfig::Config conf;
+	// auto&	root = conf.getRoot();
+	// auto&	profiles = root.add("profiles", libconfig::Setting::Type::TypeArray);
+	FILE *domien = fopen( (ED->session_dir() + "/.AD_profiles").c_str(), "w");
+	if ( domien ) {
+		for ( auto &P : global_artifact_detection_profiles ) {
+			fprintf( domien, "%s\n", P.first.c_str());
+			fprintf( domien, "%a  %a %a  %a %a %a  %a %a  %a %a %a "
+				 "%zu %zu %d %d\n",
+				 P.second.scope,
+				 P.second.upper_thr, P.second.lower_thr,
+				 P.second.f0, P.second.fc, P.second.bandwidth,
+				 P.second.mc_gain, P.second.iir_backpolate,
+				 P.second.E, P.second.dmin, P.second.dmax,
+				 P.second.sssu_hist_size,
+				 P.second.smooth_side,
+				 (int)P.second.estimate_E,
+				 (int)P.second.use_range);
+
+		}
+		fclose( domien);
+	} else
+		fprintf( stderr, "failed to open $EXPROOT/.AD_profiles for writing\n");
+}
+
+
 size_t
 __attribute__ ((pure))
 aghui::SExpDesignUI::
@@ -288,138 +347,6 @@ aghui::SExpDesignUI::
 
 
 
-int
-aghui::SExpDesignUI::
-populate( bool do_load)
-{
-	printf( "\nSExpDesignUI::populate():\n");
-	AghDD = ED->enumerate_sessions();
-	_AghDi = AghDD.begin();
-	AghGG = ED->enumerate_groups();
-	_AghGi = AghGG.begin();
-	AghHH = ED->enumerate_all_channels();
-	_AghHi = AghHH.begin();
-	AghTT = ED->enumerate_eeg_channels();
-	_AghTi = AghTT.begin();
-	AghEE = ED->enumerate_episodes();
-	_AghEi = AghEE.begin();
-
-	printf( "*     Sessions: %s\n"
-		"*       Groups: %s\n"
-		"* All Channels: %s\n"
-		"* EEG Channels: %s\n"
-		"*     Episodes: %s\n",
-		agh::str::join( AghDD, "; ").c_str(),
-		agh::str::join( AghGG, "; ").c_str(),
-		agh::str::join( AghHH, "; ").c_str(),
-		agh::str::join( AghTT, "; ").c_str(),
-		agh::str::join( AghEE, "; ").c_str());
-
-	used_samplerates =
-		ED->used_samplerates();
-	used_eeg_samplerates =
-		ED->used_samplerates( sigfile::SChannel::TType::eeg);
-	if ( used_eeg_samplerates.size() == 1 )
-		printf( "* single common EEG samplerate: %zu\n", used_eeg_samplerates.front());
-	else
-		printf( "* multiple EEG samplerates (%zu)\n", used_eeg_samplerates.size());
-
-	if ( do_load ) {
-		if ( load_settings() )
-			fprintf( stderr, "load_settings() had issues\n");
-		if ( geometry.w > 0 ) {// implies the rest are, too
-			// gtk_window_parse_geometry( wMainWindow, _geometry_placeholder.c_str());
-			gtk_window_move( wMainWindow, geometry.x, geometry.y);
-			gtk_window_resize( wMainWindow, geometry.w, geometry.h);
-		}
-	}
-
-	gtk_window_set_title( wMainWindow,
-			      (string ("Aghermann: ") + agh::str::homedir2tilda( ED->session_dir())).c_str());
-	if ( last_used_version != VERSION ) {
-		printf( "Upgrading from version %s, here's ChangeLog for you\n", last_used_version.c_str());
-		show_changelog();
-		last_used_version = VERSION;
-	}
-
-	snprintf_buf( "Smooth: %zu", smooth_profile);
-	gtk_button_set_label( (GtkButton*)eMsmtProfileSmooth, __buf__);
-
-	if ( AghTT.empty() )
-		aghui::pop_ok_message( wMainWindow,
-				       "No EEG channels",
-				       "There are no EEG channels found in any recordings in the tree.");
-	if ( AghTT.empty() or AghGG.empty() ) {
-		show_empty_experiment_blurb();
-		gtk_widget_set_visible( (GtkWidget*)lTaskSelector2, FALSE);
-		gtk_widget_set_visible( (GtkWidget*)cMsmtMainToolbar, FALSE);
-		gtk_widget_set_visible( gtk_notebook_get_nth_page( tTaskSelector, 1), FALSE);
-	} else {
-		populate_mChannels();
-		populate_mSessions();
-		populate_mGlobalAnnotations();
-		populate_mGlobalADProfiles();
-		populate_1();
-
-		if ( display_profile_type == sigfile::TMetricType::Psd ) {
-			gtk_combo_box_set_active( eMsmtProfileType, 0);
-			gtk_widget_set_visible( (GtkWidget*)cMsmtProfileParams2, FALSE);
-			gtk_widget_set_visible( (GtkWidget*)cMsmtProfileParams1, TRUE);
-			gtk_widget_grab_focus( (GtkWidget*)eMsmtOpFreqFrom);
-		} else {
-			gtk_combo_box_set_active( eMsmtProfileType, 1);
-			gtk_widget_set_visible( (GtkWidget*)cMsmtProfileParams1, FALSE);
-			gtk_widget_set_visible( (GtkWidget*)cMsmtProfileParams2, TRUE);
-		}
-
-		gtk_widget_set_visible( (GtkWidget*)lTaskSelector2, TRUE);
-		gtk_widget_set_visible( (GtkWidget*)cMsmtMainToolbar, TRUE);
-		gtk_widget_set_visible( gtk_notebook_get_nth_page( tTaskSelector, 1), TRUE);
-	}
-
-	if ( not ED->error_log().empty() ) {
-		gtk_text_buffer_set_text( gtk_text_view_get_buffer( tScanLog),
-					  ED->error_log().c_str(), -1);
-		gtk_widget_show_all( (GtkWidget*)wScanLog);
-	}
-
-	return 0;
-}
-
-
-void
-aghui::SExpDesignUI::
-depopulate( bool do_save)
-{
-	if ( do_save )
-		save_settings();
-
-	ED->reset_error_log();
-
-	// these are freed on demand immediately before reuse; leave them alone
-	AghGG.clear();
-	AghDD.clear();
-	AghEE.clear();
-	AghHH.clear();
-	AghTT.clear();
-
-	g_signal_handler_block( eMsmtSession, eMsmtSession_changed_cb_handler_id);
-	g_signal_handler_block( eMsmtChannel, eMsmtChannel_changed_cb_handler_id);
-
-	gtk_list_store_clear( mSessions);
-	gtk_list_store_clear( mAllChannels);
-	gtk_list_store_clear( mEEGChannels);
-	gtk_tree_store_clear( mGlobalAnnotations);
-	gtk_list_store_clear( mGlobalADProfiles);
-
-	__reconnect_sessions_combo();
-	g_signal_handler_unblock( eMsmtSession, eMsmtSession_changed_cb_handler_id);
-	__reconnect_channels_combo();
-	g_signal_handler_unblock( eMsmtChannel, eMsmtChannel_changed_cb_handler_id);
-}
-
-
-
 
 void
 aghui::SExpDesignUI::
@@ -465,99 +392,32 @@ do_purge_computed()
 }
 
 
-
-
-void
-aghui::SExpDesignUI::
-populate_mSessions()
-{
-	g_signal_handler_block( eMsmtSession, eMsmtSession_changed_cb_handler_id);
-	gtk_list_store_clear( mSessions);
-	GtkTreeIter iter;
-	for ( auto &D : AghDD ) {
-		gtk_list_store_append( mSessions, &iter);
-		gtk_list_store_set( mSessions, &iter,
-				    0, D.c_str(),
-				    -1);
-	}
-	__reconnect_sessions_combo();
-	g_signal_handler_unblock( eMsmtSession, eMsmtSession_changed_cb_handler_id);
-}
-
-
-
-
-
-
 void
 aghui::SExpDesignUI::
-populate_mChannels()
+do_detect_ultradian_cycle( agh::CRecording& M)
 {
-	g_signal_handler_block( eMsmtChannel, eMsmtChannel_changed_cb_handler_id);
-	gtk_list_store_clear( mEEGChannels);
-	gtk_list_store_clear( mAllChannels);
-	// users of mAllChannels (SF pattern) connect to model dynamically
-
-	for ( auto &H : AghTT ) {
-		GtkTreeIter iter;
-		gtk_list_store_append( mEEGChannels, &iter);
-		gtk_list_store_set( mEEGChannels, &iter,
-				    0, H.c_str(),
-				    -1);
-	}
-
-	for ( auto &H : AghHH ) {
-		GtkTreeIter iter;
-		gtk_list_store_append( mAllChannels, &iter);
-		gtk_list_store_set( mAllChannels, &iter,
-				    0, H.c_str(),
-				    -1);
-	}
-
-	__reconnect_channels_combo();
-	g_signal_handler_unblock( eMsmtChannel, eMsmtChannel_changed_cb_handler_id);
+	gsl_siman_params_t siman_params;
+	// specially for ubuntu
+	siman_params.n_tries		=   (int)(5 * uc_accuracy_factor);
+	siman_params.iters_fixed_T	=   (int)(10 * uc_accuracy_factor);
+	siman_params.step_size		=    4;
+	siman_params.k			=    1.0;
+	siman_params.t_initial  	=   10 * uc_accuracy_factor;
+	siman_params.mu_t		=    1.003;
+	siman_params.t_min		=    5e-2;
+	agh::beersma::ultradian_cycles(
+		M,
+		{ display_profile_type,
+		  operating_range_from, operating_range_upto,
+		  .1, siman_params});
 }
 
 
 
 
-
-void
-aghui::SExpDesignUI::
-__reconnect_channels_combo()
-{
-	gtk_combo_box_set_model( eMsmtChannel, (GtkTreeModel*)mEEGChannels);
-
-	if ( !AghTT.empty() ) {
-		int Ti = AghTi();
-		if ( Ti != -1 )
-			gtk_combo_box_set_active( eMsmtChannel, Ti);
-		else
-			gtk_combo_box_set_active( eMsmtChannel, 0);
-	}
-}
-
-
 void
 aghui::SExpDesignUI::
-__reconnect_sessions_combo()
-{
-	gtk_combo_box_set_model( eMsmtSession, (GtkTreeModel*)mSessions);
-
-	if ( !AghDD.empty() ) {
-		int Di = AghDi();
-		if ( Di != -1 )
-			gtk_combo_box_set_active( eMsmtSession, Di);
-		else
-			gtk_combo_box_set_active( eMsmtSession, 0);
-	}
-}
-
-
-
-void
-aghui::SExpDesignUI::
-__adjust_op_freq_spinbuttons()
+adjust_op_freq_spinbuttons()
 {
 	suppress_redraw = true;
 
@@ -592,159 +452,6 @@ __adjust_op_freq_spinbuttons()
 
 void
 aghui::SExpDesignUI::
-populate_mGlobalAnnotations()
-{
-	gtk_tree_store_clear( mGlobalAnnotations);
-      // apart from tree store, also refresh global list
-	global_annotations.clear();
-
-	GtkTreeIter
-		iter_g, iter_j, iter_d, iter_e, iter_a;
-	const char
-		*last_g = NULL, *last_j = NULL, *last_d = NULL, *last_e = NULL;
-
-	for ( auto &G : ED->groups ) {
-		for ( auto &J : G.second ) {
-			for ( auto &D : J.measurements ) {
-				for ( auto &E : D.second.episodes ) {
-					auto annotations = E.get_annotations();
-					if ( annotations.size() > 0 ) {
-						if ( last_g != G.first.c_str() ) {
-							gtk_tree_store_append( mGlobalAnnotations, &iter_g, NULL);
-							gtk_tree_store_set( mGlobalAnnotations, &iter_g,
-									    0, G.first.c_str(),
-									    mannotations_visibility_switch_col, TRUE,
-									    -1);
-							last_j = last_d = last_e = NULL;
-						}
-						if ( last_j != J.name() ) {
-							gtk_tree_store_append( mGlobalAnnotations, &iter_j, &iter_g);
-							gtk_tree_store_set( mGlobalAnnotations, &iter_j,
-									    0, last_j = J.name(),
-									    mannotations_visibility_switch_col, TRUE,
-									    -1);
-							last_d = last_e = NULL;
-						}
-						if ( last_d != D.first.c_str() ) {
-							gtk_tree_store_append( mGlobalAnnotations, &iter_d, &iter_j);
-							gtk_tree_store_set( mGlobalAnnotations, &iter_d,
-									    0, last_d = D.first.c_str(),
-									    mannotations_visibility_switch_col, TRUE,
-									    -1);
-							last_e = NULL;
-						}
-						if ( last_e != E.name() ) {
-							gtk_tree_store_append( mGlobalAnnotations, &iter_e, &iter_d);
-							gtk_tree_store_set( mGlobalAnnotations, &iter_e,
-									    0, last_e = E.name(),
-									    mannotations_visibility_switch_col, TRUE,
-									    -1);
-						}
-						for ( auto &A : annotations ) {
-
-							global_annotations.emplace_front( J, D.first, E, A);
-
-							auto pages = A.page_span( pagesize()) * 1u;
-							if ( pages.a == pages.z )
-								snprintf_buf( "%u", pages.a + 1);
-							else
-								snprintf_buf( "%u-%u", pages.a + 1, pages.z + 1);
-							gtk_tree_store_append( mGlobalAnnotations, &iter_a, &iter_e);
-							gtk_tree_store_set( mGlobalAnnotations, &iter_a,
-									    1, __buf__,
-									    2, A.channel(),
-									    3, A.label.c_str(),
-									    mannotations_ref_col, (gpointer)&global_annotations.front(),
-									    mannotations_visibility_switch_col, TRUE,
-									    -1);
-						}
-					}
-				}
-			}
-		}
-	}
-	gtk_tree_view_expand_all( tvGlobalAnnotations);
-}
-
-
-
-void
-aghui::SExpDesignUI::
-populate_mGlobalADProfiles()
-{
-	load_artifact_detection_profiles();
-	gtk_list_store_clear( mGlobalADProfiles);
-	for ( auto &P : global_artifact_detection_profiles ) {
-		GtkTreeIter iter;
-		gtk_list_store_append( mEEGChannels, &iter);
-		gtk_list_store_set( mEEGChannels, &iter,
-				    0, P.first.c_str(),
-				    -1);
-	}
-}
-
-
-void
-aghui::SExpDesignUI::
-load_artifact_detection_profiles()
-{
-	FILE *domien = fopen( (ED->session_dir() + "/.AD_profiles").c_str(), "r");
-	if ( domien ) {
-		while ( !feof (domien) ) {
-			SDetectArtifactsParamPack P;
-			char *_ = NULL;
-			getline( &_, NULL, domien);
-			fscanf( domien, "%la  %la %la  %la %la %la  %la %la  %la %la %la "
-				"%zu %zu %d %d\n",
-				&P.scope,
-				&P.upper_thr, &P.lower_thr,
-				&P.f0, &P.fc, &P.bandwidth,
-				&P.mc_gain, &P.iir_backpolate,
-				&P.E, &P.dmin, &P.dmax,
-				&P.sssu_hist_size,
-				&P.smooth_side,
-				&P.estimate_E,
-				&P.use_range);
-			global_artifact_detection_profiles[_] = P;
-			free( _);
-		}
-		fclose( domien);
-	} else
-		fprintf( stderr, "failed to open $EXPROOT/.AD_profiles for reading\n");
-}
-
-void
-aghui::SExpDesignUI::
-save_artifact_detection_profiles() const
-{
-	// libconfig::Config conf;
-	// auto&	root = conf.getRoot();
-	// auto&	profiles = root.add("profiles", libconfig::Setting::Type::TypeArray);
-	FILE *domien = fopen( (ED->session_dir() + "/.AD_profiles").c_str(), "w");
-	if ( domien ) {
-		for ( auto &P : global_artifact_detection_profiles ) {
-			fprintf( domien, "%s\n", P.first.c_str());
-			fprintf( domien, "%a  %a %a  %a %a %a  %a %a  %a %a %a "
-				 "%zu %zu %d %d\n",
-				 P.second.scope,
-				 P.second.upper_thr, P.second.lower_thr,
-				 P.second.f0, P.second.fc, P.second.bandwidth,
-				 P.second.mc_gain, P.second.iir_backpolate,
-				 P.second.E, P.second.dmin, P.second.dmax,
-				 P.second.sssu_hist_size,
-				 P.second.smooth_side,
-				 (int)P.second.estimate_E,
-				 (int)P.second.use_range);
-
-		}
-		fclose( domien);
-	} else
-		fprintf( stderr, "failed to open $EXPROOT/.AD_profiles for writing\n");
-}
-
-
-void
-aghui::SExpDesignUI::
 calculate_profile_scale()
 {
 	double	avg_profile_height = 0.;
@@ -768,193 +475,6 @@ calculate_profile_scale()
 }
 
 
-void
-aghui::SExpDesignUI::
-populate_1()
-{
-	if ( ED->groups.empty() )
-		return;
-
-      // touch toolbar controls
-	suppress_redraw = true;
-	gtk_spin_button_set_value( eMsmtOpFreqFrom, operating_range_from);
-	gtk_spin_button_set_value( eMsmtOpFreqWidth, operating_range_upto - operating_range_from);
-
-      // deal with the main drawing area
-	groups.clear();
-	gtk_container_foreach( (GtkContainer*)cMeasurements,
-			       (GtkCallback)gtk_widget_destroy,
-			       NULL);
-
-	printf( "SExpDesignUI::populate_1(): session \"%s\", channel \"%s\"\n", AghD(), AghT());
-
-	time_t	earliest_start = (time_t)-1,
-		latest_end = (time_t)-1;
-      // first pass: (1) create SSubjectPresentation's
-      //             (2) determine common timeline
-	for ( auto Gi = ED->groups.begin(); Gi != ED->groups.end(); ++Gi ) {
-		groups.emplace_back( Gi, *this); // precisely need the iterator, not object by reference
-		SGroupPresentation& Gp = groups.back();
-		for ( auto &J : Gi->second ) {
-			Gp.emplace_back( J, Gp);
-			const SSubjectPresentation& j = Gp.back();
-			if ( j.cscourse && J.have_session(*_AghDi) ) {
-				auto& ee = J.measurements[*_AghDi].episodes;
-				if ( not ee.empty() ) {
-					// (2)
-					if ( earliest_start == (time_t)-1 || earliest_start > ee.front().start_rel )
-						earliest_start = ee.front().start_rel;
-					if ( latest_end == (time_t)-1 || latest_end < ee.back().end_rel )
-						latest_end = ee.back().end_rel;
-				} else
-					fprintf( stderr, "SExpDesignUI::populate_1(): session \"%s\", channel \"%s\" for subject \"%s\" is empty\n",
-						 AghD(), AghT(), J.name());
-			}
-		}
-	}
-
-	timeline_start = earliest_start;
-	timeline_end   = latest_end;
-	timeline_width = (timeline_end - timeline_start) / 3600 * timeline_pph;
-	timeline_pages = (timeline_end - timeline_start) / ED->fft_params.pagesize;
-
-	if ( profile_scale_psd == 0. || profile_scale_mc == 0. ) // not previously saved
-		calculate_profile_scale();
-
-	printf( "SExpDesignUI::populate_1(): common timeline:\n");
-	fputs( asctime( localtime(&earliest_start)), stderr);
-	fputs( asctime( localtime(&latest_end)), stderr);
-
-	tl_left_margin = tl_right_margin = 0;
-
-      // walk again thoroughly, set timeline drawing area length
-	for ( auto &G : groups ) {
-	      // convert avg episode times
-		g_string_assign( __ss__, "");
-		for ( auto &E : AghEE ) {
-			pair<float, float>& avge = G.group().avg_episode_times[*_AghDi][E];
-			unsigned seconds, h0, m0, s0, h9, m9, s9;
-			seconds = avge.first * 24 * 60 * 60;
-			h0 = seconds / 60 / 60;
-			m0  = seconds % 3600 / 60;
-			s0  = seconds % 60;
-			seconds = avge.second * 24 * 60 * 60;
-			h9 = seconds / 60 / 60;
-			m9  = seconds % 3600 / 60;
-			s9  = seconds % 60;
-
-			g_string_append_printf( __ss__,
-						"       <i>%s</i> %02d:%02d:%02d ~ %02d:%02d:%02d",
-						E.c_str(),
-						h0 % 24, m0, s0,
-						h9 % 24, m9, s9);
-		}
-
-		gchar *g_escaped = g_markup_escape_text( G.name(), -1);
-		snprintf_buf( "<b>%s</b> (%zu) %s", g_escaped, G.size(), __ss__->str);
-		g_free( g_escaped);
-
-		G.expander = (GtkExpander*)gtk_expander_new( __buf__);
-		gtk_expander_set_use_markup( G.expander, TRUE);
-		g_object_set( (GObject*)G.expander,
-			      "visible", TRUE,
-			      "expanded", TRUE,
-			      "height-request", -1,
-			      NULL);
-		gtk_box_pack_start( (GtkBox*)cMeasurements,
-				    (GtkWidget*)G.expander, FALSE, TRUE, 3);
-		gtk_container_add( (GtkContainer*)G.expander,
-				   (GtkWidget*) (G.vbox = (GtkExpander*)gtk_box_new( GTK_ORIENTATION_VERTICAL, 1)));
-		g_object_set( (GObject*)G.vbox,
-			      "height-request", -1,
-			      NULL);
-
-		for ( auto &J : G ) {
-			J.da = gtk_drawing_area_new();
-			gtk_box_pack_start( (GtkBox*)G.vbox,
-					    J.da, TRUE, TRUE, 2);
-
-			// determine tl_left_margin
-			{
-				cairo_t *cr = gdk_cairo_create( gtk_widget_get_window( J.da));
-				cairo_text_extents_t extents;
-				cairo_select_font_face( cr, "serif", CAIRO_FONT_SLANT_ITALIC, CAIRO_FONT_WEIGHT_BOLD);
-				cairo_set_font_size( cr, 11);
-				cairo_text_extents( cr, J.csubject.name(), &extents);
-				if ( tl_left_margin < extents.width )
-					tl_left_margin = extents.width;
-				cairo_destroy( cr);
-			}
-
-			gtk_widget_add_events( J.da,
-					       (GdkEventMask)
-					       GDK_EXPOSURE_MASK |
-					       GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
-					       GDK_SCROLL_MASK |
-					       GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK |
-					       GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK |
-					       GDK_POINTER_MOTION_MASK);
-			g_signal_connect( J.da, "draw",
-					  (GCallback)daSubjectTimeline_draw_cb,
-					  &J);
-			g_signal_connect( J.da, "enter-notify-event",
-					  (GCallback)daSubjectTimeline_enter_notify_event_cb,
-					  &J);
-			g_signal_connect( J.da, "leave-notify-event",
-					  (GCallback)daSubjectTimeline_leave_notify_event_cb,
-					  &J);
-			g_signal_connect( J.da, "scroll-event",
-					  (GCallback)daSubjectTimeline_scroll_event_cb,
-					  &J);
-			g_signal_connect( J.da, "button-press-event",
-					  (GCallback)daSubjectTimeline_button_press_event_cb,
-					  &J);
-			g_signal_connect( J.da, "motion-notify-event",
-					  (GCallback)daSubjectTimeline_motion_notify_event_cb,
-					  &J);
-
-			g_signal_connect( J.da, "drag-data-received",
-					  (GCallback)common_drag_data_received_cb,
-					  this);
-			g_signal_connect( J.da, "drag-drop",
-					  (GCallback)common_drag_drop_cb,
-					  this);
-			gtk_drag_dest_set( J.da, GTK_DEST_DEFAULT_ALL,
-					   NULL, 0, GDK_ACTION_COPY);
-			gtk_drag_dest_add_uri_targets( J.da);
-		}
-	}
-
-      // walk quickly one last time to set widget attributes (importantly, involving tl_left_margin)
-	tl_left_margin += 10;
-	for ( auto &G : groups )
-		for ( auto &J : G )
-			g_object_set( (GObject*)J.da,
-				      "can-focus", TRUE,
-				      "app-paintable", TRUE,
-				      "height-request", timeline_height,
-				      "width-request", timeline_width + tl_left_margin + tl_right_margin,
-				      NULL);
-
-	snprintf_buf( "<small>%zusec/%gHz/%s</small>",
-		      ED->fft_params.pagesize,
-		      ED->fft_params.binsize,
-		      sigfile::SFFTParamSet::welch_window_type_name( ED->fft_params.welch_window_type));
-	gtk_label_set_markup( lMsmtPSDInfo, __buf__);
-
-	snprintf_buf( "<small>%gHz/%g/%g</small>",
-		      ED->mc_params.bandwidth,
-		      ED->mc_params.iir_backpolate,
-		      ED->mc_params.mc_gain);
-	gtk_label_set_markup( lMsmtMCInfo, __buf__);
-
-	suppress_redraw = false;
-//	set_cursor_busy( false, (GtkWidget*)wMainWindow);
-	gtk_widget_show_all( (GtkWidget*)(cMeasurements));
-}
-
-
-
 
 void
 aghui::SExpDesignUI::
@@ -1118,26 +638,4 @@ update_subject_details_interactively( agh::CSubject& J)
 }
 
 
-
-
-void
-aghui::SExpDesignUI::
-do_detect_ultradian_cycle( agh::CRecording& M)
-{
-	gsl_siman_params_t siman_params;
-	// specially for ubuntu
-	siman_params.n_tries		=   (int)(5 * uc_accuracy_factor);
-	siman_params.iters_fixed_T	=   (int)(10 * uc_accuracy_factor);
-	siman_params.step_size		=    4;
-	siman_params.k			=    1.0;
-	siman_params.t_initial  	=   10 * uc_accuracy_factor;
-	siman_params.mu_t		=    1.003;
-	siman_params.t_min		=    5e-2;
-	agh::beersma::ultradian_cycles(
-		M,
-		{ display_profile_type,
-		  operating_range_from, operating_range_upto,
-		  .1, siman_params});
-}
-
 // eof
diff --git a/src/ui/ed.hh b/src/ui/ed.hh
index d7a389c..8918573 100644
--- a/src/ui/ed.hh
+++ b/src/ui/ed.hh
@@ -347,7 +347,7 @@ class SExpDesignUI
 	void populate_mChannels();
 	void populate_mGlobalAnnotations();
 	void populate_mGlobalADProfiles();
-	void __adjust_op_freq_spinbuttons();
+	void adjust_op_freq_spinbuttons();
 	void __reconnect_channels_combo();
 	void __reconnect_sessions_combo();
 };
diff --git a/src/ui/ed_cb.cc b/src/ui/ed_cb.cc
index 5a4f00e..0b23b3a 100644
--- a/src/ui/ed_cb.cc
+++ b/src/ui/ed_cb.cc
@@ -309,7 +309,7 @@ eMsmtProfileType_changed_cb( GtkComboBox* b, gpointer userdata)
 		ED.autoscale )
 		ED.calculate_profile_scale();
 
-	ED.__adjust_op_freq_spinbuttons();
+	ED.adjust_op_freq_spinbuttons();
 
 	gtk_widget_queue_draw( (GtkWidget*)ED.cMeasurements);
 }

-- 
Sleep experiment manager



More information about the debian-med-commit mailing list