private long[] getTagsInBits(TagsByTaxaByte aTBT, int tagIndex, int[] reDirect, int anchorTaxa) {
   int lgPerSite = (anchorTaxa / 64) + 1;
   long[] seq = new long[lgPerSite];
   for (int j = 0; j < aTBT.getTaxaCount(); j++) {
     if (reDirect[j] < 0) continue;
     int index = reDirect[j] / 64;
     int offset = reDirect[j] % 64;
     if (aTBT.getReadCountForTagTaxon(tagIndex, j) > 0) { // reference alleles
       seq[index] = seq[index] | (1L << offset);
     }
   }
   return seq;
 }
 public long[] getTagDistInBits(int[] newTestFamilies) {
   int lgPerSite = (refAlignment.getSequenceCount() / 64) + 1;
   long[] seq = new long[lgPerSite];
   for (int i = 0; i < newTestFamilies.length; i++) {
     for (int j = 0; j < family2TBTIndex[newTestFamilies[i]].length; j++) {
       int index =
           tbt2anchorRedirect[newTestFamilies[i]][family2TBTIndex[newTestFamilies[i]][j]] / 64;
       int offset =
           tbt2anchorRedirect[newTestFamilies[i]][family2TBTIndex[newTestFamilies[i]][j]] % 64;
       if (tbt.getReadCountForTagTaxon(tagIndex, family2TBTIndex[newTestFamilies[i]][j])
           > 0) { // reference alleles
         seq[index] = seq[index] | (1L << offset);
       }
     }
   }
   return seq;
 }
 private int[] getMinPresentFamily(int tagIndex, float minPresentInFamily) {
   ArrayList<Integer> overMinPresentFamilyList = new ArrayList();
   for (int i = 0; i < family2TBTIndex.length; i++) {
     int cnt = 0;
     for (int j = 0; j < family2TBTIndex[i].length; j++) {
       if (tbt.getReadCountForTagTaxon(tagIndex, family2TBTIndex[i][j]) != 0) cnt++;
     }
     float rate = (float) cnt / family2TBTIndex[i].length;
     if (rate > minPresentInFamily) overMinPresentFamilyList.add(i);
   }
   if (overMinPresentFamilyList.isEmpty()) return null;
   int[] overMinPresentFamily = new int[overMinPresentFamilyList.size()];
   for (int i = 0; i < overMinPresentFamily.length; i++) {
     overMinPresentFamily[i] = overMinPresentFamilyList.get(i);
   }
   return overMinPresentFamily;
 }