This is an automated email from the git hooks/post-receive script. hmmr-guest pushed a commit to branch WIP in repository aghermann.
commit 6959a6c38daccd3f5ef299cc379a8d74c920428d Author: Andrei Zavada <[email protected]> Date: Fri Oct 11 01:47:14 2013 +0300 WIP (EMG-perturbation-based AD in Simple Artifact Detection dialog, and then some) --- upstream/data/sf-artifacts-simple.glade | 229 +++++++++++++++++--- upstream/data/sf.glade | 5 +- upstream/src/aghermann/ui/sf/channel.cc | 22 +- upstream/src/aghermann/ui/sf/channel.hh | 20 +- upstream/src/aghermann/ui/sf/construct.cc | 4 +- .../ui/sf/d/artifacts-simple-construct.cc | 4 + upstream/src/aghermann/ui/sf/d/artifacts-simple.cc | 17 +- upstream/src/aghermann/ui/sf/d/artifacts-simple.hh | 22 +- upstream/src/aghermann/ui/sf/montage-menus_cb.cc | 22 +- upstream/src/aghermann/ui/sf/sf_cb.hh | 2 +- upstream/src/aghermann/ui/sf/widgets.hh | 2 +- 11 files changed, 288 insertions(+), 61 deletions(-) diff --git a/upstream/data/sf-artifacts-simple.glade b/upstream/data/sf-artifacts-simple.glade index 2756600..7b5d1bf 100644 --- a/upstream/data/sf-artifacts-simple.glade +++ b/upstream/data/sf-artifacts-simple.glade @@ -8,6 +8,20 @@ <property name="step_increment">0.01</property> <property name="page_increment">0.10000000000000001</property> </object> + <object class="GtkAdjustment" id="jSFASMinSteadyToneFactor"> + <property name="lower">1</property> + <property name="upper">20</property> + <property name="value">1.1000000000000001</property> + <property name="step_increment">0.10000000000000001</property> + <property name="page_increment">0.5</property> + </object> + <object class="GtkAdjustment" id="jSFASMinSteadyToneRun"> + <property name="lower">1</property> + <property name="upper">9999</property> + <property name="value">1</property> + <property name="step_increment">1</property> + <property name="page_increment">5</property> + </object> <object class="GtkAdjustment" id="jSFASPad"> <property name="upper">10</property> <property name="value">0.20000000000000001</property> @@ -35,6 +49,7 @@ <object class="GtkButtonBox" id="dialog-action_area14"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="margin_top">10</property> <property name="layout_style">end</property> <child> <object class="GtkButton" id="bFilterCancel1"> @@ -79,7 +94,7 @@ <object class="GtkTable" id="table4"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="n_rows">6</property> + <property name="n_rows">11</property> <property name="n_columns">3</property> <property name="row_spacing">10</property> <child> @@ -93,8 +108,8 @@ <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> <property name="x_options">GTK_FILL</property> <property name="y_options">GTK_FILL</property> </packing> @@ -110,8 +125,8 @@ <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> <property name="x_options">GTK_FILL</property> <property name="y_options">GTK_FILL</property> </packing> @@ -131,99 +146,247 @@ </packing> </child> <child> - <object class="GtkSeparator" id="separator1"> + <object class="GtkSpinButton" id="eSFASMinFlatRegionSize"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + <property name="xalign">1</property> + <property name="invisible_char_set">True</property> + <property name="adjustment">jSFASMinFlatRegionSize</property> + <property name="digits">2</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label47"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="margin_right">5</property> + <property name="xalign">1</property> + <property name="label" translatable="yes">Minimal flat region size:</property> + <property name="use_underline">True</property> </object> <packing> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> </packing> </child> <child> - <object class="GtkSeparator" id="separator13"> + <object class="GtkLabel" id="label48"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="margin_top">5</property> - <property name="margin_bottom">5</property> + <property name="margin_right">5</property> + <property name="xalign">1</property> + <property name="label" translatable="yes">Pad:</property> + <property name="use_underline">True</property> </object> <packing> - <property name="right_attach">3</property> <property name="top_attach">4</property> <property name="bottom_attach">5</property> </packing> </child> <child> - <object class="GtkSpinButton" id="eSFASMinFlatRegionSize"> + <object class="GtkSpinButton" id="eSFASPad"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="invisible_char">•</property> <property name="xalign">1</property> <property name="invisible_char_set">True</property> - <property name="adjustment">jSFASMinFlatRegionSize</property> + <property name="adjustment">jSFASPad</property> <property name="digits">2</property> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">end</property> + <property name="margin_top">5</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Flat signal</property> + <attributes> + <attribute name="style" value="italic"/> + </attributes> + </object> + <packing> + <property name="right_attach">3</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="right_attach">3</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> </packing> </child> <child> - <object class="GtkLabel" id="label47"> + <object class="GtkLabel" id="label1"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="margin_right">5</property> + <property name="valign">end</property> + <property name="margin_top">5</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Perturbations in EMG</property> + <attributes> + <attribute name="style" value="italic"/> + </attributes> + </object> + <packing> + <property name="right_attach">3</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> + </child> + <child> + <object class="GtkSeparator" id="separator13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="right_attach">3</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="eSFASLookAtEMG"> + <property name="label" translatable="yes">Mark artifacts where EMG is </property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="halign">end</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="eSFASMinSteadyToneFactor"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> <property name="xalign">1</property> - <property name="label" translatable="yes">Minimal flat region size:</property> - <property name="use_underline">True</property> + <property name="adjustment">jSFASMinSteadyToneFactor</property> + <property name="digits">2</property> + <property name="numeric">True</property> </object> <packing> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> </packing> </child> <child> - <object class="GtkLabel" id="label48"> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">5</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">times steady tone</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label3"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="margin_right">5</property> <property name="xalign">1</property> - <property name="label" translatable="yes">Pad:</property> + <property name="label" translatable="yes">seen for at least</property> <property name="use_underline">True</property> </object> <packing> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> + <property name="top_attach">8</property> + <property name="bottom_attach">9</property> </packing> </child> <child> - <object class="GtkSpinButton" id="eSFASPad"> + <object class="GtkSpinButton" id="eSFASMinSteadyToneRun"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="invisible_char">•</property> <property name="xalign">1</property> <property name="invisible_char_set">True</property> - <property name="adjustment">jSFASPad</property> - <property name="digits">2</property> + <property name="adjustment">jSFASMinSteadyToneRun</property> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> + <property name="top_attach">8</property> + <property name="bottom_attach">9</property> </packing> </child> <child> - <placeholder/> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">5</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">sec</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">8</property> + <property name="bottom_attach">9</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> </child> <child> - <placeholder/> + <object class="GtkSeparator" id="separator2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="right_attach">3</property> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + </packing> </child> <child> - <placeholder/> + <object class="GtkCheckButton" id="eSFASThisChannelOnly"> + <property name="label" translatable="yes">Apply to this channel only</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="halign">start</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="right_attach">3</property> + <property name="top_attach">10</property> + <property name="bottom_attach">11</property> + </packing> </child> </object> <packing> diff --git a/upstream/data/sf.glade b/upstream/data/sf.glade index 94ba205..ad640db 100644 --- a/upstream/data/sf.glade +++ b/upstream/data/sf.glade @@ -342,10 +342,11 @@ </object> </child> <child> - <object class="GtkMenuItem" id="iSFPageArtifactsMarkFlat"> + <object class="GtkMenuItem" id="iSFPageSimpleArtifacts"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="label" translatable="yes">_Mark flat regions...</property> + <property name="tooltip_markup" translatable="yes">Mark artifacts where signal is flat or EMG levels are high</property> + <property name="label" translatable="yes">_Simple artifact detection...</property> <property name="use_underline">True</property> </object> </child> diff --git a/upstream/src/aghermann/ui/sf/channel.cc b/upstream/src/aghermann/ui/sf/channel.cc index 479d9ec..08e262a 100644 --- a/upstream/src/aghermann/ui/sf/channel.cc +++ b/upstream/src/aghermann/ui/sf/channel.cc @@ -39,6 +39,7 @@ SChannel (agh::CRecording& r, size_t y0, int seq) : crecording (r), + schannel (crecording.F().channel_by_id( crecording.h())), filters (r.F().filters(h())), annotations (r.F().annotations(h())), artifacts (r.F().artifacts(r.h())), @@ -433,7 +434,7 @@ mark_flat_regions_as_artifacts( const double minsize, const double pad) size_t marked_here = 0; auto d = sigproc::derivative( signal_original); - size_t last_j = 0; + size_t last_j = 0; for ( size_t i = 0; i < d.size(); ++i ) if ( d[i] == 0. ) { size_t j = i; @@ -468,6 +469,23 @@ mark_flat_regions_as_artifacts( const double minsize, const double pad) (double)(artifacts.total() - total_before) }; } +pair<double, double> +SScoringFacility::SChannel:: +mark_emg_perturbations_as_artifacts( const double min_steadytone_factor, const double min_steadytone_run) +{ + // which EMG channels are there? + forward_list<SChannel*> HH; + for ( auto &H : channels ) + if ( H.schannel.type() == sigfile::SChannel::TType::emg ) + HH.push_front( &H); + if ( HH.empty() ) + return -1; + + + return { (double)marked_here/samplerate(), + (double)(artifacts.total() - total_before) }; +} + @@ -488,7 +506,7 @@ mark_region_as_artifact( const bool do_mark) get_signal_filtered(); - if ( schannel().type() == sigfile::SChannel::TType::eeg ) { + if ( schannel.type() == sigfile::SChannel::TType::eeg ) { get_psd_course(); get_psd_in_bands(); get_spectrum( _p.cur_page()); diff --git a/upstream/src/aghermann/ui/sf/channel.hh b/upstream/src/aghermann/ui/sf/channel.hh index 3a65200..2f3521f 100644 --- a/upstream/src/aghermann/ui/sf/channel.hh +++ b/upstream/src/aghermann/ui/sf/channel.hh @@ -48,20 +48,21 @@ struct SScoringFacility::SChannel { bool operator==( const string&) const; bool operator==( const SChannel&) const; + // references to CExpDesign objects we represent agh::CRecording& crecording; + sigfile::SChannel& + schannel; // shortcuts int h() const { return crecording.h(); } - const sigfile::SChannel& - schannel() const - { return crecording.F().channel_by_id( h()); } const char* name() const - { return schannel().name(); } + { return schannel.name(); } + // contents sigfile::SFilterPack& filters; list<sigfile::SAnnotation>& @@ -89,11 +90,18 @@ struct SScoringFacility::SChannel { // artifacts float percent_dirty; - float calculate_dirty_percent(); - void detect_artifacts( const metrics::mc::SArtifactDetectionPPack&); + float + calculate_dirty_percent(); + + void + detect_artifacts( const metrics::mc::SArtifactDetectionPPack&); + pair<double, double> mark_flat_regions_as_artifacts( double at_least_this_long, double pad); + pair<double, double> + mark_emg_perturbations_as_artifacts( double min_steadytone_factor, double min_steadytone_run); + // annotations list<sigfile::SAnnotation*> in_annotations( double time) const; diff --git a/upstream/src/aghermann/ui/sf/construct.cc b/upstream/src/aghermann/ui/sf/construct.cc index fcc254c..a871572 100644 --- a/upstream/src/aghermann/ui/sf/construct.cc +++ b/upstream/src/aghermann/ui/sf/construct.cc @@ -238,7 +238,7 @@ SScoringFacilityWidgets () AGH_GBGETOBJ (iSFPageUseThisScale); AGH_GBGETOBJ (iSFPageArtifactsDetect); AGH_GBGETOBJ (iSFPageArtifactsClear); - AGH_GBGETOBJ (iSFPageArtifactsMarkFlat); + AGH_GBGETOBJ (iSFPageSimpleArtifacts); AGH_GBGETOBJ (iSFPageHide); AGH_GBGETOBJ (iSFPageHidden); AGH_GBGETOBJ (iSFPageSpaceEvenly); @@ -295,7 +295,7 @@ SScoringFacilityWidgets () G_CONNECT_1 (iSFPageExportSignal, activate); G_CONNECT_1 (iSFPageUseThisScale, activate); G_CONNECT_1 (iSFPageArtifactsDetect, activate); - G_CONNECT_1 (iSFPageArtifactsMarkFlat, activate); + G_CONNECT_1 (iSFPageSimpleArtifacts, activate); G_CONNECT_1 (iSFPageArtifactsClear, activate); G_CONNECT_1 (iSFPageHide, activate); diff --git a/upstream/src/aghermann/ui/sf/d/artifacts-simple-construct.cc b/upstream/src/aghermann/ui/sf/d/artifacts-simple-construct.cc index b8a151a..77bdc28 100644 --- a/upstream/src/aghermann/ui/sf/d/artifacts-simple-construct.cc +++ b/upstream/src/aghermann/ui/sf/d/artifacts-simple-construct.cc @@ -29,6 +29,10 @@ SArtifactsSimpleDialogWidgets () AGH_GBGETOBJ (wSFAS); AGH_GBGETOBJ (eSFASMinFlatRegionSize); AGH_GBGETOBJ (eSFASPad); + AGH_GBGETOBJ (eSFASLookAtEMG); + AGH_GBGETOBJ (eSFASMinSteadyToneFactor); + AGH_GBGETOBJ (eSFASMinSteadyToneRun); + AGH_GBGETOBJ (eSFASThisChannelOnly); } diff --git a/upstream/src/aghermann/ui/sf/d/artifacts-simple.cc b/upstream/src/aghermann/ui/sf/d/artifacts-simple.cc index 85229ad..42577b1 100644 --- a/upstream/src/aghermann/ui/sf/d/artifacts-simple.cc +++ b/upstream/src/aghermann/ui/sf/d/artifacts-simple.cc @@ -26,12 +26,21 @@ artifacts_simple_d() SScoringFacility::SArtifactsSimpleDialog:: SArtifactsSimpleDialog (SScoringFacility& p_) - : min_size (0.5), - pad (), + : flat_min_size (0.5), + flat_pad (.2), + do_emg_perturbations_check (true), + emg_min_steadytone_factor (1.5), + emg_min_steadytone_run (2.), _p (p_) { - W_V.reg( eSFASMinFlatRegionSize, &min_size); - W_V.reg( eSFASPad, &pad); + W_V.reg( eSFASMinFlatRegionSize, &flat_min_size); + W_V.reg( eSFASPad, &flat_pad); + W_V.reg( eSFASLookAtEMG, &do_emg_perturbations_check); + W_V.reg( eSFASMinSteadyToneFactor, &emg_min_steadytone_factor); + W_V.reg( eSFASMinSteadyToneRun, &emg_min_steadytone_run); + W_V.reg( eSFASThisChannelOnly, &this_channel_only); + + W_V.up(); } diff --git a/upstream/src/aghermann/ui/sf/d/artifacts-simple.hh b/upstream/src/aghermann/ui/sf/d/artifacts-simple.hh index 7642ae6..1ec0a03 100644 --- a/upstream/src/aghermann/ui/sf/d/artifacts-simple.hh +++ b/upstream/src/aghermann/ui/sf/d/artifacts-simple.hh @@ -31,13 +31,23 @@ struct SArtifactsSimpleDialogWidgets { SArtifactsSimpleDialogWidgets (); ~SArtifactsSimpleDialogWidgets (); - GtkBuilder *builder; + GtkBuilder + *builder; GtkDialog *wSFAS; GtkSpinButton *eSFASMinFlatRegionSize, *eSFASPad; + + GtkCheckButton + *eSFASLookAtEMG; + GtkSpinButton + *eSFASMinSteadyToneFactor, + *eSFASMinSteadyToneRun; + + GtkCheckButton + *eSFASThisChannelOnly; }; struct SScoringFacility::SArtifactsSimpleDialog @@ -47,8 +57,14 @@ struct SScoringFacility::SArtifactsSimpleDialog SArtifactsSimpleDialog (SScoringFacility&); - double min_size, - pad; + double flat_min_size, + flat_pad; + + bool do_emg_perturbations_check; + double emg_min_steadytone_factor, + emg_min_steadytone_run; + + bool this_channel_only; SUIVarCollection W_V; diff --git a/upstream/src/aghermann/ui/sf/montage-menus_cb.cc b/upstream/src/aghermann/ui/sf/montage-menus_cb.cc index 887d2e3..14c0c6b 100644 --- a/upstream/src/aghermann/ui/sf/montage-menus_cb.cc +++ b/upstream/src/aghermann/ui/sf/montage-menus_cb.cc @@ -321,7 +321,7 @@ iSFPageArtifactsDetect_activate_cb( } void -iSFPageArtifactsMarkFlat_activate_cb( +iSFPageSimpleArtifacts_activate_cb( GtkMenuItem*, const gpointer userdata) { @@ -331,12 +331,20 @@ iSFPageArtifactsMarkFlat_activate_cb( gtk_dialog_run( (GtkDialog*)AS.wSFAS) ) { AS.W_V.down(); - auto marked = SF.using_channel->mark_flat_regions_as_artifacts( AS.min_size, AS.pad); - - SF.sb_message( - snprintf_buf( - "Detected %.2g sec of flat regions, adding %.2g sec to already marked", - marked.first, marked.second)); + if ( AS.this_channel_only ) { + auto marked_flat = SF.using_channel->mark_flat_regions_as_artifacts( AS.flat_min_size, AS.flat_pad); + if ( AS.do_emg_perturbations_check ) + SF.using_channel->mark_emg_perturbations_as_artifacts( AS.emg_min_steadytone_factor, AS.emg_min_steadytone_run); + // SF.sb_message( + // snprintf_buf( + // "Detected %.2g sec of flat regions and %.2g sec of EMG perturbations", + // marked_flat.first, marked_flat.second)); + } else + for ( auto& H : SF.channels ) { + H.mark_flat_regions_as_artifacts( AS.flat_min_size, AS.flat_pad); + if ( AS.do_emg_perturbations_check ) + H.mark_emg_perturbations_as_artifacts( AS.emg_min_steadytone_factor, AS.emg_min_steadytone_run); + } gtk_widget_queue_draw( (GtkWidget*)SF.daSFMontage); gtk_widget_queue_draw( (GtkWidget*)SF.daSFHypnogram); diff --git a/upstream/src/aghermann/ui/sf/sf_cb.hh b/upstream/src/aghermann/ui/sf/sf_cb.hh index e8ad8f3..259846a 100644 --- a/upstream/src/aghermann/ui/sf/sf_cb.hh +++ b/upstream/src/aghermann/ui/sf/sf_cb.hh @@ -92,7 +92,7 @@ void iSFPageUseResample_toggled_cb( GtkCheckMenuItem*, gpointer); void iSFPageDrawZeroline_toggled_cb( GtkCheckMenuItem*, gpointer); void iSFPageDrawEMGSteadyTone_toggled_cb( GtkCheckMenuItem*, gpointer); void iSFPageArtifactsDetect_activate_cb( GtkMenuItem*, gpointer); -void iSFPageArtifactsMarkFlat_activate_cb( GtkMenuItem*, gpointer); +void iSFPageSimpleArtifacts_activate_cb( GtkMenuItem*, gpointer); void iSFPageArtifactsClear_activate_cb( GtkMenuItem*, gpointer); void iSFPageFilter_activate_cb( GtkMenuItem*, gpointer); void iSFPageSaveChannelAsSVG_activate_cb( GtkMenuItem*, gpointer); diff --git a/upstream/src/aghermann/ui/sf/widgets.hh b/upstream/src/aghermann/ui/sf/widgets.hh index 35d64bd..d369bd0 100644 --- a/upstream/src/aghermann/ui/sf/widgets.hh +++ b/upstream/src/aghermann/ui/sf/widgets.hh @@ -165,7 +165,7 @@ struct SScoringFacilityWidgets { *iSFPageFilter, *iSFPageSaveChannelAsSVG, *iSFPageSaveMontageAsSVG, *iSFPageExportSignal, *iSFPageUseThisScale, - *iSFPageArtifactsDetect, *iSFPageArtifactsMarkFlat, *iSFPageArtifactsClear, + *iSFPageArtifactsDetect, *iSFPageSimpleArtifacts, *iSFPageArtifactsClear, *iSFPageHide, *iSFPageHidden, // has a submenu *iSFPageSpaceEvenly, -- Alioth's /git/debian-med/git-commit-notice on /srv/git.debian.org/git/debian-med/aghermann.git _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit
