public virtual IEnumerable<string> WriteToFile(string outputFile, List<FeatureItemGroup> features, string removeNamePrefix)
    {
      Dictionary<string, Dictionary<string, SmallRNASequence>> sequences = new Dictionary<string, Dictionary<string, SmallRNASequence>>();
      foreach (var fig in features)
      {
        foreach (var sam in fig)
        {
          foreach (var loc in sam.Locations)
          {
            foreach (var samloc in loc.SamLocations)
            {
              var aligned = samloc.SamLocation.Parent;
              var seq = new SmallRNASequence()
              {
                Sample = aligned.Sample,
                Sequence = aligned.Sequence,
                Count = aligned.QueryCount
              };

              Dictionary<string, SmallRNASequence> ssList;
              if (!sequences.TryGetValue(seq.Sample, out ssList))
              {
                ssList = new Dictionary<string, SmallRNASequence>();
                sequences[seq.Sample] = ssList;
                ssList[seq.Sequence] = seq;
              }
              else
              {
                if (!ssList.ContainsKey(seq.Sequence))
                {
                  ssList[seq.Sequence] = seq;
                }
              }
            }
          }
        }
      }

      var counts = sequences.ToDictionary(m => m.Key, m => m.Value.Values.ToList());
      var samples = sequences.Keys.OrderBy(m => m).ToArray();

      List<SmallRNASequenceContig> mergedSequences = SmallRNASequenceUtils.BuildContigByIdenticalSimilarity(counts, minOverlapRate, maxExtensionBase, topNumber);
      new SmallRNASequenceContigFormat().WriteToFile(outputFile, mergedSequences);
      new SmallRNASequenceContigDetailFormat().WriteToFile(outputFile + ".details", mergedSequences);

      return new[] { outputFile };
    }
    public static List<SmallRNASequence> ReadCountFile(FileItem file, Func<string[], bool> accept)
    {
      var countList = new List<SmallRNASequence>();
      using (var sr = new StreamReader(file.File))
      {
        var header = sr.ReadLine();
        string line;
        while ((line = sr.ReadLine()) != null)
        {
          var parts = line.Split('\t');
          if (parts.Length < 3)
          {
            continue;
          }
          if (!accept(parts))
          {
            continue;
          }

          var seq = new SmallRNASequence()
          {
            Sample = file.Name,
            Sequence = parts[2],
            Count = int.Parse(parts[1])
          };

          countList.Add(seq);
        }
      }

      return countList;
    }