docs: def step3(expnums, ccd, version, rate_min,
            rate_max, angle, width, field=None, prefix=None, dry_run=False,
            maximum_flux_ratio=3, minimum_area=5, minimum_median_flux=1000.0):
      """run the actual step3  on the given exp/ccd combo"""
  
      jmp_args = ['step3jmp']
      matt_args = ['step3jjk']
  
      idx = 0
      cmd_args = []
      for expnum in expnums:
          idx += 1
          for ext in ['unid.jmp', 'unid.matt']:
              storage.get_file(expnum, ccd=ccd, version=version, ext=ext, prefix=prefix)
          image = os.path.splitext(os.path.basename(storage.get_uri(expnum, ccd, version=version, prefix=prefix)))[0]
          cmd_args.append('-f%d' % idx)
          cmd_args.append(image)
  
      cmd_args.extend(['-rn', str(rate_min),
                       '-rx', str(rate_max),
                       '-a', str(angle),
                       '-w', str(width)])
      jmp_args.extend(cmd_args)
  
      # Add some extra arguemnents for the ISO search.
      cmd_args.extend(['-fr', str(maximum_flux_ratio),
                       '-ma', str(minimum_area),
                       '-mf', str(minimum_median_flux)])
      matt_args.extend(cmd_args)
  
      logging.info(util.exec_prog(jmp_args))
      logging.info(util.exec_prog(matt_args))
  
      if dry_run:
          return
  
      if field is None:
          field = str(expnums[0])
      storage.mkdir(os.path.dirname(storage.get_uri(field,
                                                    ccd=ccd,
                                                    version=version,
                                                    prefix=prefix)))
  
      for ext in ['moving.jmp', 'moving.matt']:
          uri = storage.get_uri(field,
                                ccd=ccd,
                                version=version,
                                ext=ext,
                                prefix=prefix)
          filename = '%s%d%s%s.%s' % (prefix, expnums[0],
                                      version,
                                      str(ccd).zfill(2),
                                      ext)
          storage.copy(filename, uri)
  
      return