示例#1
0
    def _args_to_payload(self, *args, **kwargs):
        """
        accepts the arguments for different query functions and
        builds a script suitable for the Vizier votable CGI.
        """
        body = OrderedDict()
        center = kwargs.get('center')
        # process: catalog
        catalog = kwargs.get('catalog')
        if catalog is None:
            catalog = self.catalog
        if catalog is not None:
            if isinstance(catalog, six.string_types):
                body['-source'] = catalog
            elif isinstance(catalog, list):
                body['-source'] = ",".join(catalog)
            else:
                raise TypeError("Catalog must be specified as list or string")
        # process: columns
        columns = kwargs.get('columns')
        if columns is None:
            columns = copy.copy(self.columns)
        else:
            columns = self.columns + columns

        # keyword names that can mean 'all' need to be treated separately
        alls = ['all','*']
        if any(x in columns for x in alls):
            for x in alls:
                if x in columns:
                    columns.remove(x)
            body['-out.all'] = 2

        # process: columns - always request computed positions in degrees
        if "_RAJ2000" not in columns:
            columns += ["_RAJ2000"]
        if "_DEJ2000" not in columns:
            columns += ["_DEJ2000"]
        # process: columns - identify sorting requests
        columns_out = []
        sorts_out = []
        for column in columns:
            if column[0] == '+':
                columns_out += [column[1:]]
                sorts_out += [column[1:]]
            elif column[0] == '-':
                columns_out += [column[1:]]
                sorts_out += [column]
            else:
                columns_out += [column]
        body['-out.add'] = ','.join(columns_out)
        body['-out'] = columns_out
        if len(sorts_out) > 0:
            body['-sort'] = ','.join(sorts_out)
        # process: maximum rows returned
        row_limit = kwargs.get('row_limit') or self.ROW_LIMIT
        if row_limit < 0:
            body["-out.max"] = 'unlimited'
        else:
            body["-out.max"] = row_limit
        # process: column filters
        column_filters = self.column_filters.copy()
        column_filters.update(kwargs.get('column_filters', {}))
        for (key, value) in column_filters.items():
            body[key] = value
        # process: center
        if center is not None:
            for (key, value) in center.items():
                body[key] = value
        # add column metadata: name, unit, UCD1+, and description
        body["-out.meta"] = "huUD"
        # merge tables when a list is queried against a single catalog
        body["-out.form"] = "mini"
        # computed position should always be in decimal degrees
        body["-oc.form"] = "d"

        ucd = kwargs.get('ucd', "") + self.ucd
        if ucd:
            body['-ucd'] = ucd

        # create final script
        script = "\n".join(["{key}={val}".format(key=key, val=val)
                            for key, val in body.items()])
        # add keywords
        if not isinstance(self.keywords, property) and self.keywords is not None:
            script += "\n" + str(self.keywords)
        return script
示例#2
0
文件: core.py 项目: dshiga/astroquery
 def _args_to_payload(self, *args, **kwargs):
     """
     accepts the arguments for different query functions and
     builds a script suitable for the Vizier votable CGI.
     """
     body = OrderedDict()
     caller = kwargs['caller']
     del kwargs['caller']
     catalog = kwargs.get('catalog')
     if catalog is not None:
         if isinstance(catalog, basestring):
             body['-source'] = catalog
         elif isinstance(catalog, list):
             body['-source'] = ",".join(catalog)
         else:
             raise TypeError("Catalog must be specified as list or string")
     if caller == 'query_object_async':
         body["-c"] = args[0]
     elif caller == 'query_region_async':
         c = commons.parse_coordinates(args[0])
         ra = str(c.icrs.ra.degree)
         dec = str(c.icrs.dec.degree)
         if dec[0] not in ['+', '-']:
             dec = '+' + dec
         body["-c"] = "".join([ra, dec])
         # decide whether box or radius
         if kwargs.get('radius') is not None:
             radius = kwargs['radius']
             unit, value = _parse_dimension(radius)
             switch = "-c.r" + unit
             body[switch] = value
         elif kwargs.get('width') is not None:
             width = kwargs['width']
             w_unit, w_value = _parse_dimension(width)
             switch = "-c.b" + w_unit
             height = kwargs.get('height')
             # is box a rectangle or square?
             if height is not None:
                 h_unit, h_value = _parse_dimension(height)
                 if h_unit != w_unit:
                     warnings.warn(
                         "Converting height to same unit as width")
                     h_value = u.Quantity(h_value, u.Unit
                                          (_str_to_unit(h_unit))).to(u.Unit(_str_to_unit(w_unit)))
                 body[switch] = "x".join([str(w_value), str(h_value)])
             else:
                 body[switch] = "x".join([str(w_value)] * 2)
         elif kwargs.get('height'):
             warnings.warn(
                 "No width given - shape interpreted as square (height x height)")
             height = kwargs['height']
             h_unit, h_value = _parse_dimension(height)
             switch = "-c.b" + h_unit
             body[switch] = h_value
         else:
             raise Exception(
                 "At least one of radius, width/height must be specified")
     # set output parameters
     if not isinstance(self.columns, property) and self.columns is not None:
         if "all" in self.columns:
             body["-out"] = "**"
         else:
             out_cols = ",".join([col for col in self.columns])
             # if default then return default cols and listed cols
             if "default" in self.columns:
                 body["-out.add"] = out_cols
             # else return only the listed cols
             else:
                 body["-out"] = out_cols
     # otherwise ask to return default columns
     else:
         body["-out"] = "*"
     # set the maximum rows returned
     body["-out.max"] = Vizier.ROW_LIMIT
     script = "\n".join(["{key}={val}".format(key=key, val=val)
                        for key, val in body.items()])
     # add keywords
     if not isinstance(self.keywords, property) and self.keywords is not None:
         script += "\n" + str(self.keywords)
     # add column filters
     if not isinstance(self.column_filters, property) and self.column_filters is not None:
         filter_str = "\n".join(["{key}={constraint}".format(key=key, constraint=constraint) for key, constraint in
                                 self.column_filters.items()])
         script += "\n" + filter_str
     return script
示例#3
0
 def _args_to_payload(self, *args, **kwargs):
     """
     accepts the arguments for different query functions and
     builds a script suitable for the Vizier votable CGI.
     """
     body = OrderedDict()
     center = kwargs.get('center')
     # process: catalog
     catalog = kwargs.get('catalog')
     if catalog is None:
         catalog = self.catalog
     if catalog is not None:
         if isinstance(catalog, basestring):
             body['-source'] = catalog
         elif isinstance(catalog, list):
             body['-source'] = ",".join(catalog)
         else:
             raise TypeError("Catalog must be specified as list or string")
     # process: columns
     columns = kwargs.get('columns')
     if columns is None:
         columns = self.columns
     else:
         columns = self.columns + columns
     # process: columns - always request computed positions in degrees
     if "_RAJ2000" not in columns:
         columns += ["_RAJ2000"]
     if "_DEJ2000" not in columns:
         columns += ["_DEJ2000"]
     # process: columns - identify sorting requests
     columns_out = []
     sorts_out = []
     for column in columns:
         if column[0] == '+':
             columns_out += [column[1:]]
             sorts_out += [column[1:]]
         elif column[0] == '-':
             columns_out += [column[1:]]
             sorts_out += [column]
         else:
             columns_out += [column]
     body['-out'] = ','.join(columns_out)
     if len(sorts_out)>0:
         body['-sort'] = ','.join(sorts_out)
     # process: maximum rows returned
     if self.ROW_LIMIT < 0:
         body["-out.max"] = 'unlimited'
     else:
         body["-out.max"] = self.ROW_LIMIT
     # process: column filters
     column_filters = self.column_filters.copy()
     column_filters.update(kwargs.get('column_filters', {}))
     for (key, value) in column_filters.items():
         body[key] = value
     # process: center
     if center is not None:
         for (key, value) in center.items():
             body[key] = value
     # add column metadata: name, unit, UCD1+, and description
     body["-out.meta"] = "huUD"
     # computed position should always be in decimal degrees
     body["-oc.form"] = "d"
     # create final script
     script = "\n".join(["{key}={val}".format(key=key, val=val)
                for key, val in body.items()])
     # add keywords
     if not isinstance(self.keywords, property) and self.keywords is not None:
         script += "\n" + str(self.keywords)
     return script
示例#4
0
文件: core.py 项目: adrn/astroquery
 def _args_to_payload(self, *args, **kwargs):
     """
     accepts the arguments for different query functions and
     builds a script suitable for the Vizier votable CGI.
     """
     body = OrderedDict()
     center = kwargs.get('center')
     # process: catalog
     catalog = kwargs.get('catalog')
     if catalog is None:
         catalog = self.catalog
     if catalog is not None:
         if isinstance(catalog, stringtypes):
             body['-source'] = catalog
         elif isinstance(catalog, list):
             body['-source'] = ",".join(catalog)
         else:
             raise TypeError("Catalog must be specified as list or string")
     # process: columns
     columns = kwargs.get('columns')
     if columns is None:
         columns = self.columns
     else:
         columns = self.columns + columns
     # process: columns - always request computed positions in degrees
     if "_RAJ2000" not in columns:
         columns += ["_RAJ2000"]
     if "_DEJ2000" not in columns:
         columns += ["_DEJ2000"]
     # process: columns - identify sorting requests
     columns_out = []
     sorts_out = []
     for column in columns:
         if column[0] == '+':
             columns_out += [column[1:]]
             sorts_out += [column[1:]]
         elif column[0] == '-':
             columns_out += [column[1:]]
             sorts_out += [column]
         else:
             columns_out += [column]
     body['-out'] = ','.join(columns_out)
     if len(sorts_out) > 0:
         body['-sort'] = ','.join(sorts_out)
     # process: maximum rows returned
     if self.ROW_LIMIT < 0:
         body["-out.max"] = 'unlimited'
     else:
         body["-out.max"] = self.ROW_LIMIT
     # process: column filters
     column_filters = self.column_filters.copy()
     column_filters.update(kwargs.get('column_filters', {}))
     for (key, value) in column_filters.items():
         body[key] = value
     # process: center
     if center is not None:
         for (key, value) in center.items():
             body[key] = value
     # add column metadata: name, unit, UCD1+, and description
     body["-out.meta"] = "huUD"
     # computed position should always be in decimal degrees
     body["-oc.form"] = "d"
     # create final script
     script = "\n".join([
         "{key}={val}".format(key=key, val=val)
         for key, val in body.items()
     ])
     # add keywords
     if not isinstance(self.keywords,
                       property) and self.keywords is not None:
         script += "\n" + str(self.keywords)
     return script