code: def trim(args):
      
  
      from jcvi.algorithms.maxsum import max_sum
  
      p = OptionParser(trim.__doc__)
      p.add_option("-c", dest="min_length", type="int", default=64,
              help="minimum sequence length after trimming")
      p.add_option("-s", dest="score", default=QUAL,
              help="quality trimming cutoff [default: %default]")
      opts, args = p.parse_args(args)
  
      if len(args) != 2:
          sys.exit(p.print_help())
  
      fastafile, newfastafile = args
      qualfile = get_qual(fastafile)
      newqualfile = get_qual(newfastafile, check=False)
  
      logging.debug("Trim bad sequence from fasta file `%s` to `%s`" % \
              (fastafile, newfastafile))
  
      fw = must_open(newfastafile, "w")
      fw_qual = open(newqualfile, "w")
  
      dropped = trimmed = 0
  
      for rec in iter_fasta_qual(fastafile, qualfile, modify=True):
          qv = [x - opts.score for x in \
                  rec.letter_annotations["phred_quality"]]
          msum, trim_start, trim_end = max_sum(qv)
          score = trim_end - trim_start + 1
  
          if score < opts.min_length:
              dropped += 1
              continue
  
          if score < len(rec):
              trimmed += 1
              rec = rec[trim_start:trim_end + 1]
  
          write_fasta_qual(rec, fw, fw_qual)
  
      print("A total of %d sequences modified." % trimmed, file=sys.stderr)
      print("A total of %d sequences dropped (length < %d)." % \
          (dropped, opts.min_length), file=sys.stderr)
  
      fw.close()
      fw_qual.close()
docs: %prog trim fasta.screen newfasta
  
      take the screen output from `cross_match` (against a vector db, for
      example), then trim the sequences to remove X's. Will also perform quality
      trim if fasta.screen.qual is found. The trimming algorithm is based on
      finding the subarray that maximize the sum