package ua.stu.scplib.structure; import java.io.IOException; import ua.stu.scplib.attribute.BinaryInputStream; /** * <p>A class to encapsulate the SCP-ECG QRS Locations section.</p> * * @author stu */ public class Section4 extends Section { /** * <p>Get a string name for this section.</p> * * @return a string name for this section */ public String getSectionName() { return "QRS Locations"; } private int lengthOfReferenceBeat0DataInMilliSeconds; private int sampleNumberOfQRSOfFiducial; private int totalNumberOfQRSComplexes; private int[] beatType; private long[] sampleNumberOfResidualToStartSubtractingQRS; private long[] sampleNumberOfResidualOfFiducial; private long[] sampleNumberOfResidualToEndSubtractingQRS; private long[] sampleNumberOfResidualToStartProtectedArea; private long[] sampleNumberOfResidualToEndProtectedArea; public int getLengthOfReferenceBeat0DataInMilliSeconds() { return lengthOfReferenceBeat0DataInMilliSeconds; } public int getSampleNumberOfQRSOfFiducial() { return sampleNumberOfQRSOfFiducial; } public int getTotalNumberOfQRSComplexes() { return totalNumberOfQRSComplexes; } public int[] getBeatType() { return beatType; } public long[] getSampleNumberOfResidualToStartSubtractingQRS() { return sampleNumberOfResidualToStartSubtractingQRS; } public long[] getSampleNumberOfResidualOfFiducial() { return sampleNumberOfResidualOfFiducial; } public long[] getSampleNumberOfResidualToEndSubtractingQRS() { return sampleNumberOfResidualToEndSubtractingQRS; } public long[] getSampleNumberOfResidualToStartProtectedArea() { return sampleNumberOfResidualToStartProtectedArea; } public long[] getSampleNumberOfResidualToEndProtectedArea() { return sampleNumberOfResidualToEndProtectedArea; } public Section4(SectionHeader header) { super(header); } public long read(BinaryInputStream i) throws IOException { lengthOfReferenceBeat0DataInMilliSeconds=i.readUnsigned16(); bytesRead+=2; sectionBytesRemaining-=2; // System.out.println(lengthOfReferenceBeat0DataInMilliSeconds); sampleNumberOfQRSOfFiducial=i.readUnsigned16(); bytesRead+=2; sectionBytesRemaining-=2; totalNumberOfQRSComplexes=i.readUnsigned16(); bytesRead+=2; sectionBytesRemaining-=2; beatType = new int[totalNumberOfQRSComplexes]; sampleNumberOfResidualToStartSubtractingQRS = new long[totalNumberOfQRSComplexes]; sampleNumberOfResidualOfFiducial = new long[totalNumberOfQRSComplexes]; sampleNumberOfResidualToEndSubtractingQRS = new long[totalNumberOfQRSComplexes]; int qrsComplex=0; while (sectionBytesRemaining > 0 && qrsComplex < totalNumberOfQRSComplexes) { beatType[qrsComplex] = i.readUnsigned16(); bytesRead+=2; sectionBytesRemaining-=2; sampleNumberOfResidualToStartSubtractingQRS[qrsComplex] = i.readUnsigned32(); bytesRead+=4; sectionBytesRemaining-=4; sampleNumberOfResidualOfFiducial[qrsComplex] = i.readUnsigned32(); bytesRead+=4; sectionBytesRemaining-=4; sampleNumberOfResidualToEndSubtractingQRS[qrsComplex] = i.readUnsigned32(); bytesRead+=4; sectionBytesRemaining-=4; ++qrsComplex; } if (qrsComplex != totalNumberOfQRSComplexes) { System.err.println("Section 4 Number Of QRS Complexes specified as "+totalNumberOfQRSComplexes +" but encountered "+qrsComplex+" reference beat subtraction zones"); } sampleNumberOfResidualToStartProtectedArea = new long[totalNumberOfQRSComplexes]; sampleNumberOfResidualToEndProtectedArea = new long[totalNumberOfQRSComplexes]; qrsComplex=0; while (sectionBytesRemaining > 0 && qrsComplex < totalNumberOfQRSComplexes) { sampleNumberOfResidualToStartProtectedArea[qrsComplex] = i.readUnsigned32(); bytesRead+=4; sectionBytesRemaining-=4; sampleNumberOfResidualToEndProtectedArea[qrsComplex] = i.readUnsigned32(); bytesRead+=4; sectionBytesRemaining-=4; ++qrsComplex; } if (qrsComplex != totalNumberOfQRSComplexes) { System.err.println("Section 4 Number Of QRS Complexes specified as "+totalNumberOfQRSComplexes +" but encountered "+qrsComplex+" protected areas"); } skipToEndOfSectionIfNotAlreadyThere(i); return bytesRead; } public String toString() { StringBuffer strbuf = new StringBuffer(); strbuf.append("Length of Reference Beat 0 Data In MilliSeconds = "+lengthOfReferenceBeat0DataInMilliSeconds +" dec (0x"+Integer.toHexString(lengthOfReferenceBeat0DataInMilliSeconds)+")\n"); strbuf.append("Sample Number of QRS of Fiducial = "+sampleNumberOfQRSOfFiducial+" dec (0x"+Integer.toHexString(sampleNumberOfQRSOfFiducial)+")\n"); strbuf.append("Total Number Of QRS Complexes = "+totalNumberOfQRSComplexes+" dec (0x"+Integer.toHexString(totalNumberOfQRSComplexes)+")\n"); strbuf.append("Reference beat subtraction zones:\n"); for (int qrsComplex=0; qrsComplex<totalNumberOfQRSComplexes; ++qrsComplex) { strbuf.append("\tQRS Complex "+qrsComplex+":\n"); strbuf.append("\t\tBeat Type "+beatType[qrsComplex]+" dec (0x"+Integer.toHexString(beatType[qrsComplex])+")\n"); strbuf.append("\t\tSample Number of Residual to Start Subtracting QRS "+ sampleNumberOfResidualToStartSubtractingQRS[qrsComplex]+" dec (0x"+Long.toHexString(sampleNumberOfResidualToStartSubtractingQRS[qrsComplex])+")\n"); strbuf.append("\t\tSample Number of Residual of Fiducial "+ sampleNumberOfResidualOfFiducial[qrsComplex]+" dec (0x"+Long.toHexString(sampleNumberOfResidualOfFiducial[qrsComplex])+")\n"); strbuf.append("\t\tSample Number of Residual to End Subtracting QRS "+ sampleNumberOfResidualToEndSubtractingQRS[qrsComplex]+" dec (0x"+Long.toHexString(sampleNumberOfResidualToEndSubtractingQRS[qrsComplex])+")\n"); } strbuf.append("Protected areas:\n"); for (int qrsComplex=0; qrsComplex<totalNumberOfQRSComplexes; ++qrsComplex) { strbuf.append("\tQRS Complex "+qrsComplex+":\n"); strbuf.append("\t\tSample Number of Residual to Start Protected Area "+ sampleNumberOfResidualToStartProtectedArea[qrsComplex]+" dec (0x"+Long.toHexString(sampleNumberOfResidualToStartProtectedArea[qrsComplex])+")\n"); strbuf.append("\t\tSample Number of Residual to End Protected Area "+ sampleNumberOfResidualToEndProtectedArea[qrsComplex]+" dec (0x"+Long.toHexString(sampleNumberOfResidualToEndProtectedArea[qrsComplex])+")\n"); } return strbuf.toString(); } public String validate() { return ""; } }