       alreadyDone = false
       for schoolName in schoolNames when schoolName?.length > 10 and /,.+,/.test schoolName  # Long enough school name with location info (two commas)
         sharedCount = _.filter(possibleTargets, schoolName: schoolName).length
-        if sharedCount > 0.5 * possibleTargets.length
+        if sharedCount > 20 and sharedCount > 0.25 * possibleTargets.length
           console.log 'Already done', schoolName, sharedCount, possibleTargets.length, 'for', field, nextLargestGroup
           alreadyDone = true
       continue if alreadyDone

      for i in [0 ... nSamples]
        target = possibleTargets[Math.floor i * possibleTargets.length / (nSamples + 1)]
        suggestions = findSuggestions target
        reasons = _.reduce suggestions, ((sum, suggestion) ->
          for suggestion in suggestions
            for reason in suggestion.reasons
              sum += switch reason
                when 'Course instances' then 150
                when 'IP' then 40
                when 'Referrer' then 20
                when 'Name' then 15
                when 'Domain' then (if getDomain(target) in ['cps.edu', 'mynewcaneyisd.org', 'fsusd.org'] then 1 else 10)
                when 'Clans' then 0.01
          sum
        ), 0
        if reasons > mostReasons
          bestTarget = target
          bestTargetSuggestions = suggestions
          mostReasons = reasons
          bestGroup = nextLargestGroup
      break
  checkedTopGroups[bestGroup] = true

checkedTopGroups = {}
findUserToSchool = (users) ->
  # We find the top user from the top group that we can make the most reasoned suggestions about what the school name would be.
  [bestTarget, bestTargetSuggestions, bestSuggestionsScore, bestGroup] = [null, [], 0, null]
  for field, groups of topGroups
    for nextLargestGroup in groups when not checkedTopGroups[nextLargestGroup]
      possibleTargets = userCategories[field][nextLargestGroup]
