/// <summary> /// защита от неправильного использования отсутствует, /// поэтому нельзя делать эту функцию public /// </summary> public static PatientPhysioData CutPhysioDataFromLeftToRight( this PatientPhysioData _this, Marker leftMarker, Marker rightMarker) { System.Diagnostics.Debug.Assert(_this != null); var newPhysioData = new PatientPhysioData(); // Копируем все сигналы из исходных физиологических данных foreach (ChannelData channel_data in _this.Channels.Values) { var channelFragment = _this.CutChannelDataFromLeftToRight(channel_data, leftMarker, rightMarker); newPhysioData.Channels[channel_data.ChannelId] = channelFragment; } // вот на сколько микросекунд все сдвигается влево: long microseconds = 0; if (leftMarker != null) { microseconds = leftMarker.TimestampUsec; } // Модифицируем информацию о метках foreach (Marker marker in _this.Markers.Values) { if (marker.TimestampUsec < microseconds) { // пропускаем метки, которые созданы раньше чем left_marker continue; } if (rightMarker != null && rightMarker.TimestampUsec < marker.TimestampUsec) { // пропускаем метки, которые созданы позже чем right_marker continue; } // создаем копию метки Marker newMarker = new Marker(marker); // добавляем метку newPhysioData.Markers[newMarker.Id] = newMarker; // .. и смещаем метку на microseconds влево newPhysioData.MoveMarker(newMarker.Id, 0 - microseconds); } return(newPhysioData); }
/// <summary> /// Возвращает фрагмент сигнала из всех каналов нужного типа от маркера left до маркера right. /// </summary> /// <param name="physioSignalType">нужный тип физиологического сигнала.</param> /// <param name="leftMarkerId"></param> /// <param name="rightMarkerId"></param> /// <returns></returns> /// <remarks></remarks> public static IEnumerable <ChannelData> GetChannelDataBySignalType( this PatientPhysioData _this, SignalType physioSignalType, long leftMarkerId, long rightMarkerId) { // Берем сигналы нужного типа целиком var channels = _this.GetChannelDataBySignalType(physioSignalType); // Найти объекты-маркеры, соответствующие left_marker и right_marker Marker leftMarker = _this.GetMarkerByIdOrDefault(leftMarkerId); Marker rightMarker = _this.GetMarkerByIdOrDefault(rightMarkerId); var fragments = channels.Select( c => _this.CutChannelDataFromLeftToRight(c, leftMarker, rightMarker) ); return(fragments); }
public static ChannelData GetChannelDataFromLeftToRight( this PatientPhysioData _this, ChannelData channelData, long leftMarkerId, long leftMarkerOffset, long rightMarkerId, long rightMarkerOffset) { if (null == channelData) { return(null); } Marker leftMarker = _this.GetMarkerByIdOrDefault(leftMarkerId); Marker rightMarker = _this.GetMarkerByIdOrDefault(rightMarkerId); // Вырезать данные и вернуть их. return(_this.CutChannelDataFromLeftToRight(channelData, leftMarker, rightMarker)); }