/// <summary> /// Collects statistics on how much space savings minimizing will achieve, and (if outStream /// is not null) writes out the minimized cache file. /// </summary> public void Minimize(Settings settings, ProgressCallback progressCallback, Stream outStream, FileStream outStreamScans = null, FileStream outStreamPeaks = null, FileStream outStreamScores = null) { var writer = outStream == null ? null : new Writer(ChromatogramCache, settings.CacheFormat, outStream, outStreamScans, outStreamPeaks, outStreamScores); var statisticsCollector = new MinStatisticsCollector(this); bool readChromatograms = settings.NoiseTimeRange.HasValue || writer != null; var chromGroupHeaderToIndex = new Dictionary <long, int>(ChromGroupHeaderInfos.Count); for (int i = 0; i < ChromGroupHeaderInfos.Count; i++) { var cghi = ChromGroupHeaderInfos[i]; chromGroupHeaderToIndex.Add(cghi.LocationPoints, i); } var chromGroups = new ChromatogramGroupInfo[ChromGroupHeaderInfos.Count]; var transitionGroups = new List <TransitionGroupDocNode> [ChromGroupHeaderInfos.Count]; foreach (var nodePep in Document.Molecules) { foreach (var nodeGroup in nodePep.TransitionGroups) { foreach (var chromGroupInfo in ChromatogramCache.LoadChromatogramInfos(nodePep, nodeGroup, _tolerance, null)) { int headerIndex = chromGroupHeaderToIndex[chromGroupInfo.Header.LocationPoints]; if (chromGroups[headerIndex] == null) { chromGroups[headerIndex] = chromGroupInfo; transitionGroups[headerIndex] = new List <TransitionGroupDocNode>(); } transitionGroups[headerIndex].Add(nodeGroup); } } } var minimizer = new QueueWorker <MinimizeParams>(null, MinimizeAndWrite); minimizer.RunAsync(MINIMIZING_THREADS, @"Minimizing/Writing", MAX_GROUP_READ_AHEAD); for (int iHeader = 0; iHeader < ChromGroupHeaderInfos.Count; iHeader++) { var chromGroupInfo = chromGroups[iHeader]; IList <TransitionGroupDocNode> transitionGroupDocNodes; if (chromGroupInfo == null) { chromGroupInfo = ChromatogramCache.LoadChromatogramInfo(ChromGroupHeaderInfos[iHeader]); transitionGroupDocNodes = new TransitionGroupDocNode[0]; } else { transitionGroupDocNodes = transitionGroups[iHeader]; } if (readChromatograms) { try { chromGroupInfo.ReadChromatogram(ChromatogramCache, true); } catch (Exception exception) { Trace.TraceWarning(@"Unable to read chromatogram {0}", exception); } } if (minimizer.Exception != null) { break; } minimizer.Add(new MinimizeParams(writer, settings, chromGroupInfo, transitionGroupDocNodes, progressCallback, statisticsCollector)); // Null out the ChromGroup in our array so it can be garbage collected. chromGroups[iHeader] = null; } minimizer.DoneAdding(true); if (minimizer.Exception != null) { throw minimizer.Exception; } statisticsCollector.ReportProgress(progressCallback, true); if (writer != null) { writer.WriteEndOfFile(); } }