Esempio n. 1
0
        public void ReAssignWorstFit()
        {
            //dont try if no reassignment is possible.
            if (NumClusters < 2)
            {
                return;
            }

            var emptyClusters = new List <Cluster>();

            //todo, can also skip clusters that have not changed since the last iteration...

            foreach (var originalCluster in Clusters.OrderBy(x => x.NumVeads))
            {
                while (true)
                {
                    if (originalCluster.NumVeadGroups == 0)
                    {
                        break;
                    }
                    var worstVg = originalCluster.GetWorstAgreement();

                    var bestFits = GetClusterFits(worstVg);

                    if (bestFits.Count == 0)
                    {
                        break;
                    }


                    //TODO
                    //if a read fits in both, equally, test if these two clusters can be merged

                    //TODO GB for expected results, change to Last.
                    var bestFit = bestFits.First().Value[0];

                    //TODO if there is a tie for first, will originalCluster always be first? Or do we bounce back and forth between the two...
                    //if it fits better somewhere else, move it over.
                    if (bestFit != originalCluster)
                    {
                        originalCluster.Remove(worstVg);
                        bestFit.Add(worstVg);

                        if (originalCluster.NumVeadGroups == 0)
                        {
                            emptyClusters.Add(originalCluster);

                            //TODO GB THIS GIVES MY EXPECTED RESULTS
                            //RemoveCluster(originalCluster.Name);
                            //break;
                        }
                    }
                    else
                    {
                        break;
                    }
                }
            }

            foreach (var cluster in emptyClusters)
            {
                _clusterLookup.Remove(cluster.Name);
            }
        }