scpsection4.cs
来自「ecg tool kit for medical image retrieval」· CS 代码 · 共 681 行 · 第 1/2 页
CS
681 行
{
if ((_Protected != null)
&& (nr >= 0)
&& (nr < _Protected.Length))
{
return _Protected[nr].End;
}
return -1;
}
/// <summary>
/// Function to get length of protected zone.
/// </summary>
/// <param name="nr">nr of protected zone</param>
/// <returns>length of protected zone in samples</returns>
public int getProtectedLength(int nr)
{
if ((_Protected != null)
&& (nr >= 0)
&& (nr < _Protected.Length))
{
if (_Protected[nr] == null)
{
return 0;
}
int templen = _Protected[nr].End - _Protected[nr].Start;
return (templen > 0 ? templen + 1 : 0);
}
return -1;
}
/// <summary>
/// Function to set protected zones using global measurements.
/// </summary>
/// <param name="global">global measurments</param>
/// <param name="medianFreq">Samples per Second of median</param>
/// <param name="rate">Bimodal compression rate</param>
/// <param name="minbegin">Begin of all leads in samples</param>
/// <param name="maxend">End of all leads in samples</param>
public void setProtected(GlobalMeasurements global, int medianFreq, int rate, int minbegin, int maxend)
{
if ((global != null)
&& (global.measurment != null)
&& (_Subtraction != null)
&& (_Protected != null)
&& (medianFreq != 0))
{
// If global measurements are per beat use them.
if (global.measurment.Length == (_Protected.Length + 1))
{
for (int loper=0;loper < _Protected.Length;loper++)
{
_Protected[loper].Start = _Subtraction[loper].Fiducial + (short) ((global.measurment[loper + 1].QRSonset - (_FirstFiducial * 1000)) / medianFreq);
_Protected[loper].End = _Subtraction[loper].Fiducial + (short) ((global.measurment[loper + 1].QRSoffset - (_FirstFiducial * 1000)) / medianFreq);
// Make protected zones work properly
_Protected[loper].Start -= ((_Protected[loper].Start % rate) == 0 ? rate : (_Protected[loper].Start % rate));
_Protected[loper].Start++;
_Protected[loper].End += (rate - (_Protected[loper].End % rate));
// Keep it all between boundaries of ECG.
if (_Protected[loper].Start < minbegin)
{
_Protected[loper].Start = minbegin;
}
if (_Protected[loper].End > maxend)
{
_Protected[loper].End = maxend;
}
}
}
else if (global.measurment.Length > 0)
{
for (int loper=0;loper < _Protected.Length;loper++)
{
if (_Subtraction[loper].Type == 0)
{
_Protected[loper].Start = _Subtraction[loper].Fiducial + (short) ((global.measurment[0].QRSonset * medianFreq) / 1000) - _FirstFiducial;
_Protected[loper].End = _Subtraction[loper].Fiducial + (short) ((global.measurment[0].QRSoffset * medianFreq) / 1000) - _FirstFiducial;
}
// Make protected zones work properly
_Protected[loper].Start -= ((_Protected[loper].Start % rate) == 0 ? rate : (_Protected[loper].Start % rate));
_Protected[loper].Start++;
_Protected[loper].End += (rate - (_Protected[loper].End % rate));
// Keep it all between boundaries of ECG.
if (_Protected[loper].Start < minbegin)
{
_Protected[loper].Start = minbegin;
}
if (_Protected[loper].End > maxend)
{
_Protected[loper].End = maxend;
}
}
}
}
}
// Signal Manupalations
public int getSignals(out Signals signals)
{
signals = new Signals();
int err = getSignalsToObj(signals);
if (err != 0)
{
signals = null;
}
return err;
}
public int getSignalsToObj(Signals signals)
{
if (signals != null
&& Works())
{
signals.MedianLength = _MedianDataLength;
signals.MedianFiducialPoint = _FirstFiducial;
if (_NrQRS == 0)
{
signals.QRSZone = null;
}
else
{
signals.QRSZone = new QRSZone[_NrQRS];
for (int loper = 0;loper < _NrQRS;loper++)
{
signals.QRSZone[loper] = new QRSZone();
if (_Subtraction[loper] != null)
{
signals.QRSZone[loper].Type = _Subtraction[loper].Type;
signals.QRSZone[loper].Start = _Subtraction[loper].Start - 1;
signals.QRSZone[loper].Fiducial = _Subtraction[loper].Fiducial;
signals.QRSZone[loper].End = _Subtraction[loper].End;
}
}
}
return 0;
}
return 1;
}
public int setSignals(Signals signals)
{
if ((signals != null)
&& (signals.NrLeads != 0))
{
_MedianDataLength = signals.MedianLength;
_FirstFiducial = signals.MedianFiducialPoint;
if (signals.QRSZone == null)
{
_NrQRS = 0;
_Subtraction = null;
_Protected = null;
}
else
{
_NrQRS = (ushort) signals.QRSZone.Length;
_Subtraction = new SCPQRSSubtraction[_NrQRS];
_Protected = new SCPQRSProtected[_NrQRS];
for (int loper=0;loper < _NrQRS;loper++)
{
_Subtraction[loper] = new SCPQRSSubtraction();
_Protected[loper] = new SCPQRSProtected();
if (signals.QRSZone[loper] != null)
{
_Subtraction[loper].Type = signals.QRSZone[loper].Type;
_Subtraction[loper].Fiducial = signals.QRSZone[loper].Fiducial;
if (_Subtraction[loper].Type == 0)
{
_Subtraction[loper].Start = signals.QRSZone[loper].Start + 1;
_Subtraction[loper].End = signals.QRSZone[loper].End;
if (((_Subtraction[loper].End - _Subtraction[loper].Fiducial) + _FirstFiducial)
>= ((signals.MedianLength * signals.MedianSamplesPerSecond) / 1000))
{
_Subtraction[loper].End = (int) (((((signals.MedianLength * signals.MedianSamplesPerSecond) / 1000) - _FirstFiducial) + _Subtraction[loper].Fiducial - 2) & 0xfffffffe);
}
_Protected[loper].Start = _Subtraction[loper].Start;
_Protected[loper].End = _Subtraction[loper].End;
}
else
{
}
}
}
}
return 0;
}
return 1;
}
/// <summary>
/// Class containing SCP QRS subtraction zone.
/// </summary>
[StructLayout(LayoutKind.Sequential, Pack=1, CharSet=CharSet.Ansi)]
public class SCPQRSSubtraction
{
public ushort Type = ushort.MaxValue;
public int Start = 0;
public int Fiducial = 0;
public int End = 0;
/// <summary>
/// Constructor for an QRS Subtraction zone.
/// </summary>
public SCPQRSSubtraction()
{}
/// <summary>
/// Constructor for an QRS Subtraction zone.
/// </summary>
/// <param name="type">type of subtraction</param>
/// <param name="start">starting point of subtraction zone</param>
/// <param name="fiducial">fiducial point in subtraction zone</param>
/// <param name="end">ending point of subtraction zone</param>
public SCPQRSSubtraction(byte type, int start, int fiducial, int end)
{
Type = type;
Start = start;
Fiducial = fiducial;
End = end;
}
/// <summary>
/// Function to read QRS Subtraction.
/// </summary>
/// <param name="buffer">byte array to read QRS subtraction.</param>
/// <param name="offset">position to start reading</param>
/// <returns>0 on success</returns>
public int Read(byte[] buffer, int offset)
{
if (offset + Marshal.SizeOf(this) > buffer.Length)
{
return 0x1;
}
Type = (ushort) BytesTool.readBytes(buffer, offset, Marshal.SizeOf(Type), true);
offset += Marshal.SizeOf(Type);
Start = (int) BytesTool.readBytes(buffer, offset, Marshal.SizeOf(Start), true);
offset += Marshal.SizeOf(Start);
Fiducial = (int) BytesTool.readBytes(buffer, offset, Marshal.SizeOf(Fiducial), true);
offset += Marshal.SizeOf(Fiducial);
End = (int) BytesTool.readBytes(buffer, offset, Marshal.SizeOf(End), true);
offset += Marshal.SizeOf(End);
return 0x0;
}
/// <summary>
/// Function to write QRS Subtraction zone.
/// </summary>
/// <param name="buffer">byte array</param>
/// <param name="offset">position to start writing</param>
/// <returns>0 on success</returns>
public int Write(byte[] buffer, int offset)
{
if (offset + Marshal.SizeOf(this) > buffer.Length)
{
return 0x1;
}
BytesTool.writeBytes(Type, buffer, offset, Marshal.SizeOf(Type), true);
offset += Marshal.SizeOf(Type);
BytesTool.writeBytes(Start, buffer, offset, Marshal.SizeOf(Start), true);
offset += Marshal.SizeOf(Start);
BytesTool.writeBytes(Fiducial, buffer, offset, Marshal.SizeOf(Fiducial), true);
offset += Marshal.SizeOf(Fiducial);
BytesTool.writeBytes(End, buffer, offset, Marshal.SizeOf(End), true);
offset += Marshal.SizeOf(End);
return 0x0;
}
}
/// <summary>
/// Class containing QRS protected zones.
/// </summary>
[StructLayout(LayoutKind.Sequential, Pack=1, CharSet=CharSet.Ansi)]
public class SCPQRSProtected
{
public int Start = 0;
public int End = 0;
/// <summary>
/// Constructor to create an QRS protected zone.
/// </summary>
public SCPQRSProtected()
{}
/// <summary>
/// Constructor to create an QRS protected zone.
/// </summary>
/// <param name="start">start sample of zone</param>
/// <param name="end">end sample of zone</param>
public SCPQRSProtected(int start, int end)
{
Start = start;
End = end;
}
/// <summary>
/// Function to read QRS protected zone.
/// </summary>
/// <param name="buffer">byte array to read from</param>
/// <param name="offset">position to start reading</param>
/// <returns>0 on success</returns>
public int Read(byte[] buffer, int offset)
{
if (offset + Marshal.SizeOf(this) > buffer.Length)
{
return 0x1;
}
Start = (int) BytesTool.readBytes(buffer, offset, Marshal.SizeOf(Start), true);
offset += Marshal.SizeOf(Start);
End = (int) BytesTool.readBytes(buffer, offset, Marshal.SizeOf(End), true);
offset += Marshal.SizeOf(End);
return 0x0;
}
/// <summary>
/// Function to write QRS protected zone.
/// </summary>
/// <param name="buffer">byte array to write to</param>
/// <param name="offset">position to start writing</param>
/// <returns>0 on success</returns>
public int Write(byte[] buffer, int offset)
{
if (offset + Marshal.SizeOf(this) > buffer.Length)
{
return 0x1;
}
BytesTool.writeBytes(Start, buffer, offset, Marshal.SizeOf(Start), true);
offset += Marshal.SizeOf(Start);
BytesTool.writeBytes(End, buffer, offset, Marshal.SizeOf(End), true);
offset += Marshal.SizeOf(End);
return 0x0;
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?