docs: def step1(expnum,
            ccd,
            prefix='',
            version='p',
            sex_thresh=_SEX_THRESHOLD,
            wave_thresh=_WAVE_THRESHOLD,
            maxcount=_MAX_COUNT,
            dry_run=False):
      """run the actual step1jmp/matt codes.
  
      expnum: the CFHT expousre to process
      ccd: which ccd in the mosaic to process
      fwhm: the image quality, FWHM, of the image.  In pixels.
      sex_thresh: the detection threhold to run sExtractor at
      wave_thresh: the detection threshold for wavelet
      maxcount: saturation level
  
      """
  
      storage.get_file(expnum, ccd, prefix=prefix, version=version, ext='mopheader')
      filename = storage.get_image(expnum, ccd, version=version, prefix=prefix)
      fwhm = storage.get_fwhm(expnum, ccd, prefix=prefix, version=version)
      basename = os.path.splitext(filename)[0]
  
      logging.info(util.exec_prog(['step1jmp',
                                   '-f', basename,
                                   '-t', str(wave_thresh),
                                   '-w', str(fwhm),
                                   '-m', str(maxcount)]))
  
      obj_uri = storage.get_uri(expnum, ccd, version=version, ext='obj.jmp',
                                prefix=prefix)
      obj_filename = basename + ".obj.jmp"
  
      if not dry_run:
          storage.copy(obj_filename, obj_uri)
  
      ## for step1matt we need the weight image
      hdulist = fits.open(filename)
      flat_name = hdulist[0].header.get('FLAT', 'weight.fits')
      parts = os.path.splitext(flat_name)
      if parts[1] == '.fz':
          flat_name = os.path.splitext(parts[0])[0]
      else:
          flat_name = parts[0]
      try:
          flat_filename = storage.get_image(flat_name, ccd, version='', ext='fits', subdir='calibrators')
      except:
          flat_filename = storage.get_image(flat_name, ccd, version='', ext='fits', subdir='old_calibrators')
  
      if os.access('weight.fits', os.R_OK):
          os.unlink('weight.fits')
  
      if not os.access('weight.fits', os.R_OK):
          os.symlink(flat_filename, 'weight.fits')
  
      logging.info(util.exec_prog(['step1matt',
                                   '-f', basename,
                                   '-t', str(sex_thresh),
                                   '-w', str(fwhm),
                                   '-m', str(maxcount)]))
  
      if os.access('weight.fits', os.R_OK):
          os.unlink('weight.fits')
  
      obj_uri = storage.get_uri(expnum, ccd, version=version, ext='obj.matt',
                                prefix=prefix)
      obj_filename = basename + ".obj.matt"
  
      if not dry_run:
          storage.copy(obj_filename, obj_uri)
  
      return True