private void PopulateEdgeHitsAndLogBins(int numBins, int adjustedStartPosition, int messySiteWidth, int edgeThreshold,
                                                IBinEvidence binEvidence, Dictionary <int, int> edgeHits, Dictionary <int, int> edgeSingleMismatchHits, Dictionary <int, int> edgeIndelHits,
                                                Dictionary <int, int> edgeMessyHits, int startPosition, BinConclusions binConclusions, UsableBins usableBins)
        {
            for (int binId = 0; binId < numBins; binId++)
            {
                var inEdge   = false;
                var binStart = adjustedStartPosition + (binId * messySiteWidth);

                if (_geminiOptions.LogRegionsAndRealignments)
                {
                    if (binEvidence.GetAllHits(binId) > 10 && !inEdge)
                    {
                        var binCounts =
                            $"{binId},{inEdge},{binStart},{binStart + messySiteWidth},{binEvidence.GetAllHits(binId)},{usableBins.IsPositionUsable(binStart)},{binEvidence.GetSingleMismatchHit(binId)}," +
                            $"{binConclusions.GetProbableTrueSnvRegion(binId)},{binEvidence.GetIndelHit(binId)},{binConclusions.GetIndelRegionHit(binId)}," +
                            $"{binEvidence.GetMessyHit(binId)},{binConclusions.GetIsMessyEnough(binId)},{binEvidence.GetForwardMessyRegionHit(binId)},{binConclusions.GetFwdMessyStatus(binId)},{binEvidence.GetReverseMessyRegionHit(binId)},{binConclusions.GetRevMessyStatus(binId)},{binEvidence.GetMapqMessyHit(binId)},{binConclusions.GetMapqMessyStatus(binId)}";

                        // TODO consider writing this to a proper output file
                        if (_geminiOptions.LogRegionsAndRealignments)
                        {
                            Logger.WriteToLog("BINCOUNTS\t" + binCounts);
                        }
                    }
                }
            }
        }
        public void ProcessRegions(int messySiteThreshold, double imperfectFreqThreshold, int regionDepthThreshold,
                                   double indelRegionFreqThreshold, int binsToExtendTo, float directionalMessThreshold)
        {
            for (int i = 0; i < _binEvidence.NumBins; i++)
            {
                if (_collectDepth && _binEvidence.GetAllHits(i) == 0)
                {
                    continue;
                }

                if (!_collectDepth && _binEvidence.GetMessyHit(i) == 0 && _binEvidence.GetIndelHit(i) == 0)
                {
                    continue;
                }

                var messyHit = _binEvidence.GetMessyHit(i);

                var messyRegionHit = _binEvidence.GetMessyHit(i);
                UpdateDirectionalMessStatus(directionalMessThreshold, messyRegionHit, i);

                UpdateMapqMessStatus(directionalMessThreshold, i, messyRegionHit);

                var isMessy = messyHit >= messySiteThreshold;

                var isProbableSnv = false;
                if (_collectDepth)
                {
                    var allHitsHit = (float)_binEvidence.GetAllHits(i);
                    var pctMessy   = messyHit / allHitsHit;
                    var pctIndel   = _binEvidence.GetIndelHit(i) / allHitsHit;

                    isMessy = pctMessy + pctIndel >= imperfectFreqThreshold && pctIndel >= indelRegionFreqThreshold &&
                              allHitsHit >= regionDepthThreshold;

                    isProbableSnv = false; // TODO need to reconsider the below.
                    //isProbableSnv = (_singleMismatchHits[i] / (float)_allHits[i]) > 0.35;
                }


                if (isMessy && !isProbableSnv)
                {
                    SetIsMessyEnoughForSiteAndNeighborsIfNotSnv(binsToExtendTo, i);
                }

                const int snvBinsToExtendTo = 3;
                if (isProbableSnv)
                {
                    //probableTrueSnvRegions[i] = true;
                    AddProbableSnvHit(i);
                    for (int j = 0; j < snvBinsToExtendTo; j++)
                    {
                        var binIndex = i - j;
                        if (!AddProbableSnvHit(binIndex))
                        {
                            break;
                        }
                        //if (binIndex >= 0)
                        //{
                        //    probableTrueSnvRegions[binIndex] = true;
                        //}
                        //else
                        //{
                        //    break;
                        //}
                    }

                    for (int j = 0; j < snvBinsToExtendTo; j++)
                    {
                        var binIndex = i + j;
                        if (!AddProbableSnvHit(binIndex))
                        {
                            break;
                        }
                        //if (binIndex < probableTrueSnvRegions.Length)
                        //{
                        //    probableTrueSnvRegions[binIndex] = true;
                        //}
                        //else
                        //{
                        //    break;
                        //}
                    }
                }
            }
        }