public void run() {
      long starttime = System.currentTimeMillis();
      ArrayList<String> resultList = new ArrayList();
      for (int i = 0; i < tbt.getTagCount(); i++) {
        int[] minPresentFamilies = getMinPresentFamily(i, (float) 0.08);
        if (minPresentFamilies == null) continue;

        ArrayList segregationList =
            this.getSegregationFamilyGroups(i, minPresentFamilies, 10, pThresh);
        if (segregationList == null) continue;
        int[][] segregationFamilyGroups = (int[][]) segregationList.get(0);
        int[] bestChrs = (int[]) segregationList.get(1);
        int minGnum = segregationFamilyGroups.length;
        if (familyGroupNum < minGnum) minGnum = familyGroupNum;
        double[][] theResults = new double[minGnum][];
        boolean nullFlag = true;
        for (int j = 0;
            j < minGnum;
            j++) { // it should be bestChrs.length, only caculate 2 loci for now
          ScanChromosome scanOnBestChrom =
              new ScanChromosome(
                  tbt,
                  i,
                  theAnchorChrInBits[bestChrs[j] - 1],
                  segregationFamilyGroups[j],
                  j,
                  theResults,
                  0.00001,
                  1);
          scanOnBestChrom.scan();
          if (theResults[j] == null) continue;
          nullFlag = false;
        }
        if (nullFlag) continue;
        resultList.add(this.getOutputRecord(i, theResults));
      }
      result = resultList.toArray(new String[resultList.size()]);
      double secs = (double) (System.currentTimeMillis() - starttime) * 0.001;
      System.out.println(
          "Task "
              + taskID
              + " with "
              + tbt.getTagCount()
              + " tags is finished in "
              + secs
              + " seconds");
    }
 public void run() {
   long starttime = System.currentTimeMillis();
   ArrayList<String> resultList = new ArrayList();
   for (int i = 0; i < tbt.getTagCount(); i++) {
     if (tbt.getNumberOfTaxaWithTag(i) < 30) continue;
     double[] bestR = {-1, -1, -1, 1, -1};
     int blastChr = -1, blastPos = -1, bestAlignment = -1, refDiv = -1;
     long[] testTag = tbt.getTag(i);
     long[] testTagDist;
     double[][] theResults = new double[theAnchorChrInBits.length][];
     ScanChromosomeMTR[] scanOnChr = new ScanChromosomeMTR[theAnchorChrInBits.length];
     for (int cn = 0; cn < theAnchorChrInBits.length; cn++) {
       testTagDist =
           getTagsInBits(
               tbt, i, tbt2anchRedirect[cn], theAnchorChrInBits[cn].getSequenceCount());
       scanOnChr[cn] =
           new ScanChromosomeMTR(
               theAnchorChrInBits[cn], testTagDist, cn, theResults, 0.000001, 1, blastPos);
       scanOnChr[cn].scan();
     }
     int countRealSig = 0;
     double[] pRank = new double[theAnchorChrInBits.length];
     for (int cn = 0; cn < theAnchorChrInBits.length; cn++) {
       double[] r = theResults[cn];
       pRank[cn] = r[3];
       if (r[3] < bestR[3]) {
         bestR = r.clone();
         bestAlignment = cn;
       }
       if (r[3] < 0.000001) countRealSig++;
     }
     Arrays.sort(pRank);
     double[][] bestResWithNewThreshold = new double[1][];
     testTagDist =
         getTagsInBits(
             tbt,
             i,
             tbt2anchRedirect[bestAlignment],
             theAnchorChrInBits[bestAlignment].getSequenceCount());
     ScanChromosomeMTR bestChrNewThres =
         new ScanChromosomeMTR(
             theAnchorChrInBits[bestAlignment],
             testTagDist,
             0,
             bestResWithNewThreshold,
             pRank[1],
             1,
             blastPos);
     bestChrNewThres.scan();
     int countOfSitesBetterThanNextBestChr = (int) bestResWithNewThreshold[0][4];
     String s =
         String.format(
             "%s %d %d %d %d %d %d %d %g %d %d %d %g %g %d %d %d %n",
             BaseEncoder.getSequenceFromLong(testTag),
             i,
             blastChr,
             blastPos,
             refDiv,
             (int) bestR[0],
             (int) bestR[1],
             (int) bestR[2],
             bestR[3],
             (int) bestR[4],
             tbt.getNumberOfTaxaWithTag(i),
             countRealSig,
             Math.log10(pRank[1] / pRank[0]),
             Math.log10(pRank[theAnchorChrInBits.length / 2] / pRank[0]),
             countOfSitesBetterThanNextBestChr,
             bestChrNewThres.minSigPos,
             bestChrNewThres.maxSigPos);
     resultList.add(s);
   }
   result = resultList.toArray(new String[resultList.size()]);
   double secs = (double) (System.currentTimeMillis() - starttime) * 0.001;
   System.out.println(
       "Task "
           + taskID
           + " with "
           + tbt.getTagCount()
           + " tags is finished in "
           + secs
           + " seconds");
 }