ERPTier ERPTier_extractEventsWhereColumn_number (ERPTier me, Table table, long columnNumber, int which_Melder_NUMBER, double criterion) { try { Table_checkSpecifiedColumnNumberWithinRange (table, columnNumber); Table_numericize_Assert (table, columnNumber); // extraction should work even if cells are not defined if (my events -> size != table -> rows -> size) Melder_throw (me, " & ", table, ": the number of rows in the table (", table -> rows -> size, ") doesn't match the number of events (", my events -> size, ")."); autoERPTier thee = Thing_new (ERPTier); Function_init (thee.peek(), my xmin, my xmax); thy numberOfChannels = my numberOfChannels; thy channelNames = NUMvector <wchar_t *> (1, thy numberOfChannels); for (long ichan = 1; ichan <= thy numberOfChannels; ichan ++) { thy channelNames [ichan] = Melder_wcsdup (my channelNames [ichan]); } thy events = SortedSetOfDouble_create (); for (long ievent = 1; ievent <= my events -> size; ievent ++) { ERPPoint oldEvent = my event (ievent); TableRow row = table -> row (ievent); if (Melder_numberMatchesCriterion (row -> cells [columnNumber]. number, which_Melder_NUMBER, criterion)) { autoERPPoint newEvent = Data_copy (oldEvent); Collection_addItem (thy events, newEvent.transfer()); } } if (thy events -> size == 0) { Melder_warning ("No event matches criterion."); } return thee.transfer(); } catch (MelderError) { Melder_throw (me, ": events not extracted."); } }
TableOfReal TableOfReal_extractRowsWhereColumn (TableOfReal me, long column, int which_Melder_NUMBER, double criterion) { try { if (column < 1 || column > my numberOfColumns) Melder_throw ("No such column: ", column, "."); long n = 0; for (long irow = 1; irow <= my numberOfRows; irow ++) { if (Melder_numberMatchesCriterion (my data [irow] [column], which_Melder_NUMBER, criterion)) { n ++; } } if (n == 0) Melder_throw ("No row matches this criterion."); autoTableOfReal thee = TableOfReal_create (n, my numberOfColumns); copyColumnLabels (me, thee.peek()); n = 0; for (long irow = 1; irow <= my numberOfRows; irow ++) if (Melder_numberMatchesCriterion (my data [irow] [column], which_Melder_NUMBER, criterion)) copyRow (me, irow, thee.peek(), ++ n); return thee.transfer(); } catch (MelderError) { Melder_throw (me, ": rows not extracted."); } }
TableOfReal TableOfReal_extractColumnsWhereRow (TableOfReal me, long row, int which_Melder_NUMBER, double criterion) { try { if (row < 1 || row > my numberOfRows) Melder_throw ("No such row: ", row, "."); long n = 0; for (long icol = 1; icol <= my numberOfColumns; icol ++) { if (Melder_numberMatchesCriterion (my data [row] [icol], which_Melder_NUMBER, criterion)) { n ++; } } if (n == 0) Melder_throw ("No column matches this criterion."); autoTableOfReal thee = TableOfReal_create (my numberOfRows, n); copyRowLabels (me, thee.peek()); n = 0; for (long icol = 1; icol <= my numberOfColumns; icol ++) if (Melder_numberMatchesCriterion (my data [row] [icol], which_Melder_NUMBER, criterion)) copyColumn (me, icol, thee.peek(), ++ n); return thee.transfer(); } catch (MelderError) { Melder_throw (me, ": columns not extracted."); } }