docs: def download(self,age=None,metallicity=None,outdir=None,force=False):
          """
          Check valid parameter range and download isochrones from:
          http://stev.oapd.inaf.it/cgi-bin/cmd
          """
          try:
              from urllib.error import URLError
          except ImportError:
              from urllib2 import URLError
  
          if age is None: age = float(self.age)
          if metallicity is None: metallicity = float(self.metallicity)
  
          if outdir is None: outdir = './'
          basename = self.params2filename(age,metallicity)
          outfile = os.path.join(outdir,basename)
              
          if os.path.exists(outfile) and not force:
              try:
                  self.verify(outfile,self.survey,age,metallicity)
                  logger.info("Found %s; skipping..."%(outfile))
                  return
              except Exception as e:
                  msg = "Overwriting corrupted %s..."%(outfile)
                  logger.warn(msg)
                  os.remove(outfile)
                  
          mkdir(outdir)
  
          self.print_info(age,metallicity)
          self.query_server(outfile,age,metallicity)
  
          if not os.path.exists(outfile):
              raise RuntimeError('Download failed')
  
          try:
              self.verify(outfile,self.survey,age,metallicity)
          except Exception as e:
              msg = "Output file is corrupted."
              logger.error(msg)
              msg = "Removing %s."%outfile
              logger.info(msg)
              os.remove(outfile)
              raise(e)
  
          return outfile