public Dictionary <string, List <int> > LaunchWavelets(Dictionary <string, double[]> coverageByChr, Dictionary <string, uint[]> startByChr,
Dictionary <string, uint[]> endByChr, double?CV, List <double> factorOfThreeCMADs)
{
var inaByChr = new Dictionary <string, int[]>();
var finiteScoresByChr = new Dictionary <string, double[]>();
var tasks = coverageByChr.Select(scoreByChrKVP => new ThreadStart(() =>
{
string chr = scoreByChrKVP.Key;
Helper.GetFiniteIndices(scoreByChrKVP.Value, out int[] ina); // not NaN, -Inf, Inf
double[] scores;
if (ina.Length == scoreByChrKVP.Value.Length)
{
scores = scoreByChrKVP.Value;
}
else
{
Helper.ExtractValues <double>(scoreByChrKVP.Value, ina, out scores);
}
lock (finiteScoresByChr)
{
finiteScoresByChr[chr] = scores;
inaByChr[chr] = ina;
}
})).ToList();
Parallel.ForEach(tasks, task => task.Invoke());
// Quick sanity-check: If we don't have any segments, then return a dummy result.
int n = finiteScoresByChr.Values.Sum(list => list.Length);
if (n == 0)
{
return(new Dictionary <string, List <int> >());
}
var breakpointsByChr = new Dictionary <string, List <int> >();
tasks = coverageByChr.Keys.Select(chr => new ThreadStart(() =>
{
var breakpoints = new List <int>();
// to cover cases of no SNVs present (i.e. chrY) => chromosome becomes one segment
int segmentLengthByChr = Math.Max(coverageByChr[chr].Length, 1);
if (segmentLengthByChr > _parameters.MinSize)
{
WaveletSegmentation.HaarWavelets(coverageByChr[chr], _parameters.ThresholdLower,
_parameters.ThresholdUpper,
breakpoints, _parameters.IsGermline, _parameters.MadFactor,
CV, factorOfThreeCMADs, chr);
}
lock (breakpointsByChr)
{
breakpointsByChr[chr] = breakpoints;
}
})).ToList();
Console.WriteLine("{0} Launching wavelet tasks", DateTime.Now);
Parallel.ForEach(tasks, task => task.Invoke());
Console.WriteLine("{0} Completed wavelet tasks", DateTime.Now);
Console.WriteLine("{0} Segmentation results complete", DateTime.Now);
return(breakpointsByChr);
}