code: def setup_experiment(log, debug=True, verbose=False, app=None, exp_config=None):
      
  
      # Verify that the Postgres server is running.
      try:
          db.check_connection()
      except Exception:
          log("There was a problem connecting to the Postgres database!")
          raise
  
      # Check that the demo-specific requirements are satisfied.
      try:
          with open("requirements.txt", "r") as f:
              dependencies = [r for r in f.readlines() if r[:3] != "-e "]
      except (OSError, IOError):
          dependencies = []
      pkg_resources.require(dependencies)
  
      # Generate a unique id for this experiment.
      from dallinger.experiment import Experiment
  
      generated_uid = public_id = Experiment.make_uuid(app)
  
      # If the user provided an app name, use it everywhere that's user-facing.
      if app:
          public_id = str(app)
  
      log("Experiment id is " + public_id + "")
  
      # Load and update the config
      config = get_config()
      if not config.ready:
          config.load()  #
      if exp_config:
          config.extend(exp_config)
      config.extend({"id": six.text_type(generated_uid)})
  
      temp_dir = assemble_experiment_temp_dir(config)
      log("Deployment temp directory: {}".format(temp_dir), chevrons=False)
  
      # Zip up the temporary directory and place it in the cwd.
      if not debug:
          log("Freezing the experiment package...")
          shutil.make_archive(
              os.path.join(os.getcwd(), "snapshots", public_id + "-code"), "zip", temp_dir
          )
  
      return (public_id, temp_dir)
docs: Checks the experiment's python dependencies, then prepares a temp directory
      with files merged from the custom experiment and Dallinger.
  
      The resulting directory includes all the files necessary to deploy to
      Heroku.