private void AccumulateFrameDataWithYCompression(IDataReader reader, int width, int height, int startScan, int startBin, int endBin, ref int[][] frameData, int minMzBin, int maxMzBin, int xCompression, double[] calibTable) { // each pixel accumulates more than 1 bin of data for (var scansData = 0; scansData / xCompression < width && reader.Read(); scansData++) { var scanNum = GetInt32(reader, "ScanNum"); ValidateScanNumber(scanNum); var currentScan = scanNum - startScan; var compressedBinIntensity = (byte[])(reader["Intensities"]); if (compressedBinIntensity.Length == 0) { continue; } var compressedScan = currentScan; if (xCompression > 1) { compressedScan = currentScan / xCompression; } var pixelY = 0; var binIntensities = IntensityConverterCLZF.Decompress(compressedBinIntensity, out int _); foreach (var binIntensity in binIntensities) { var binIndex = binIntensity.Item1; if (binIndex < startBin || binIndex < minMzBin) { continue; } if (binIndex > endBin || binIndex > maxMzBin) { break; } double calibratedBin = binIndex; if (height == 1) { frameData[compressedScan][0] += binIntensity.Item2; } else { for (var j = pixelY; j < height; j++) { if (calibTable[j] > calibratedBin) { pixelY = j; frameData[compressedScan][pixelY] += binIntensity.Item2; break; } } } } } }
public void CompressionComparisonSpeedTest() { /* * Example run on core i9 7900X @ 4GHz. * Name Milliseconds Percent * LZ4 Compress 163 193.3% * ZRLE LZ4 Compress 84 100% * CLZF2 Compress 945 1118.5% * ZREL CLZF2 Compress 91 107.7% * Name Milliseconds Percent * LZ4 Decompress 325 16880.7% * ZRLE LZ4 Decompress 1 100% * CLZF2 Decompress 1176 61106.9% * ZREL CLZF2 Decompress 8 448.4% */ var intensities = new int[148000]; var randGenerator = new Random(); for (var i = 0; i < intensities.Length; i++) { var nextRandom = randGenerator.Next(0, 255); if (nextRandom < 245) { intensities[i] = 0; } else { intensities[i] = nextRandom; } } var spectra = new byte[intensities.Length * sizeof(int)]; Buffer.BlockCopy(intensities, 0, spectra, 0, spectra.Length); var decompressedIntensities = new int[intensities.Length]; byte[] zrleLz4Result = new byte[] { }; byte[] clzf2Result = new byte[] { }; byte[] zrleClzf2Result = new byte[] { }; byte[] snappyResult = new byte[] { }; byte[] zrleSnappyResult = new byte[] { }; Benchmark.This("CLZF2 Compress", () => { clzf2Result = CLZF2.Compress(spectra); }).WithWarmup(100).Against.This("ZREL CLZF2 Compress", () => { IntensityConverterCLZF.Compress(intensities, out zrleClzf2Result, out var tic, out var bpi, out var indexOfMaxIntensity); }).WithWarmup(100).Against.This("Snappy", () =>
private void AccumulateFrameDataNoYCompression(IDataReader reader, int width, int startScan, int startBin, int endBin, ref int[][] frameData, int minMzBin, int maxMzBin, int xCompression) { for (var scansData = 0; (scansData / xCompression < width) && reader.Read(); scansData++) { var scanNum = GetInt32(reader, "ScanNum"); ValidateScanNumber(scanNum); var currentScan = scanNum - startScan; var compressedBinIntensity = (byte[])(reader["Intensities"]); if (compressedBinIntensity.Length == 0) { continue; } var compressedScan = currentScan; if (xCompression > 1) { compressedScan = currentScan / xCompression; } var binIntensities = IntensityConverterCLZF.Decompress(compressedBinIntensity, out int _); foreach (var binIntensity in binIntensities.Where(x => x.Item1 >= startBin && x.Item1 >= minMzBin && x.Item1 <= endBin && x.Item1 <= maxMzBin)) { var binIndex = binIntensity.Item1; //if (binIndex < startBin || binIndex < minMzBin) //{ // continue; //} //if (binIndex > endBin || binIndex > maxMzBin) //{ // break; //} frameData[compressedScan][binIndex - startBin] += binIntensity.Item2; } } }