docs: def run(expnum, ccd, version, dry_run=False, prefix="", force=False, ignore_dependency=False):
      """Run the OSSOS mopheader script.
  
      """
      message = storage.SUCCESS
      logging.info("Attempting to get status on header for {} {}".format(expnum, ccd))
      if storage.get_status(task, prefix, expnum, version, ccd) and not force:
          logging.info("{} completed successfully for {} {} {} {}".format(task, prefix, expnum, version, ccd))
          return message
  
      with storage.LoggingManager(task, prefix, expnum, ccd, version, dry_run):
          try:
              logging.info("Building a mopheader ")
              if not storage.get_status(dependency, prefix, expnum, "p", 36) and not ignore_dependency:
                  raise IOError("{} not yet run for {}".format(dependency, expnum))
  
              # confirm destination directory exists.
              destdir = os.path.dirname(storage.dbimages_uri(expnum, ccd, prefix=prefix, version=version, ext='fits'))
              if not dry_run:
                  storage.mkdir(destdir)
  
              # get image from the vospace storage area
              logging.info("Retrieving image from VOSpace")
              filename = storage.get_image(expnum, ccd, version=version, prefix=prefix)
  
              # launch the stepZjmp program         
              logging.info("Launching stepZ on %s %d" % (expnum, ccd))
              expname = os.path.basename(filename).strip('.fits')
              logging.info(util.exec_prog(['stepZjmp',
                                           '-f',
                                           expname]))
              # if this is a dry run then we are finished
              if dry_run:
                  return message
  
              # push the header to the VOSpace
              mopheader_filename = expname+".mopheader"
              destination = storage.dbimages_uri(expnum, ccd, prefix=prefix, version=version, ext='mopheader')
              source = mopheader_filename
              count = 0
              with open(source, 'r'):
                while True:
                  try:
                      count += 1
                      logging.info("Attempt {} to copy {} -> {}".format(count, source, destination))
                      storage.copy(source, destination)
                      break
                  except Exception as ex:
                      if count > 10:
                          raise ex
              logging.info(message)
          except CalledProcessError as cpe:
              message = str(cpe.output)
              logging.error(message)
          except Exception as e:
              message = str(e)
              logging.error(message)
  
          if not dry_run:
              storage.set_status(task, prefix, expnum, version=version, ccd=ccd, status=message)
          
      return message