private Histogram DoCompare(INifti <float> currentnii, INifti <float> priornii) { _log.Info("Starting normalization..."); currentnii = Normalization.ZNormalize(currentnii, priornii); _log.Info($@"..done."); currentnii.RecalcHeaderMinMax(); priornii.RecalcHeaderMinMax(); var tasks = new List <Task>(); var histogram = new Histogram { Prior = priornii, Current = currentnii }; var cs = _recipe.CompareSettings; if (cs.CompareIncrease) { var t = Task.Run(() => { _log.Info("Comparing increased signal..."); var increase = Compare.GatedSubract(currentnii, priornii, cs.BackgroundThreshold, cs.MinRelevantStd, cs.MaxRelevantStd, cs.MinChange, cs.MaxChange); for (int i = 0; i < increase.Voxels.Length; ++i) { increase.Voxels[i] = increase.Voxels[i] > 0 ? increase.Voxels[i] : 0; } increase.RecalcHeaderMinMax(); increase.ColorMap = ColorMaps.RedScale(); histogram.Increase = increase; var increaseOut = currentnii.AddOverlay(increase); var outpath = _currentPath + ".increase.nii"; increaseOut.WriteNifti(outpath); Metrics.ResultFiles.Add(new ResultFile() { FilePath = outpath, Description = "Increased Signal", Type = ResultType.CURRENT_PROCESSED }); }); tasks.Add(t); } if (cs.CompareDecrease) { _log.Info("Comparing decreased signal..."); // I know the code in these two branches looks similar but there's too many inputs to make a function that much simpler... var t = Task.Run(() => { var decrease = Compare.GatedSubract(currentnii, priornii, cs.BackgroundThreshold, cs.MinRelevantStd, cs.MaxRelevantStd, cs.MinChange, cs.MaxChange); for (int i = 0; i < decrease.Voxels.Length; ++i) { decrease.Voxels[i] = decrease.Voxels[i] < 0 ? decrease.Voxels[i] : 0; } decrease.RecalcHeaderMinMax(); decrease.ColorMap = ColorMaps.ReverseGreenScale(); histogram.Decrease = decrease; var decreaseOut = currentnii.AddOverlay(decrease); var outpath = _currentPath + ".decrease.nii"; decreaseOut.WriteNifti(outpath); Metrics.ResultFiles.Add(new ResultFile() { FilePath = outpath, Description = "Decreased Signal", Type = ResultType.CURRENT_PROCESSED }); }); tasks.Add(t); } Task.WaitAll(tasks.ToArray()); _log.Info("...done."); return(histogram); }