File: ned.c

package info (click to toggle)
gnuastro 0.24-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 44,360 kB
  • sloc: ansic: 185,444; sh: 15,785; makefile: 1,303; cpp: 9
file content (190 lines) | stat: -rw-r--r-- 6,713 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/*********************************************************************
Settings for NED.
Query is part of GNU Astronomy Utilities (Gnuastro) package.

Original author:
     Mohammad akhlaghi <mohammad@akhlaghi.org>
Contributing author(s):
Copyright (C) 2021-2025 Free Software Foundation, Inc.

Gnuastro is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.

Gnuastro is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with Gnuastro. If not, see <http://www.gnu.org/licenses/>.
**********************************************************************/
#include <config.h>

#include <stdio.h>
#include <errno.h>
#include <error.h>
#include <string.h>

#include <gnuastro-internal/checkset.h>

#include "main.h"

#include "ui.h"
#include "tap.h"




/* Basic sanity checks. */
static void
ned_sanity_checks(struct queryparams *p)
{
  /* Set the summarized names. */
  if(p->datasetstr)
    {
      /* Correct the dataset name if 'objdir' is given. */
      if( !strcmp(p->datasetstr, "objdir") )
        gal_checkset_allocate_copy("NEDTAP.objdir", &p->datasetuse);
      else
        gal_checkset_allocate_copy(p->datasetstr, &p->datasetuse);


      /* Database-specific checks. For example, if we should use TAP or
         not. Note that the user may give 'NEDTAP.objdir', so we can't use
         the 'if' above (for expanding summarized names). */
      if( !strcmp(p->datasetuse, "NEDTAP.objdir") )
        p->usetap=1;
      else if( !strcmp(p->datasetuse, "extinction") )
        {
          /* Crash for options that are not compatible with extinction. */
          if( p->radius || p->width || p->range || p->noblank || p->columns
              || p->head!=GAL_BLANK_SIZE_T || p->sort )
            error(EXIT_FAILURE, 0, "NED's extinction calculator returns "
                  "the galactic extinction for a single point (in multiple "
                  "filters), therefore the following options are not "
                  "acceptable with it: '--radius', '--width', '--range', "
                  "'--noblank', '--column', '--head' and '--sort'");

          /* Make sure that '--center' is given. */
          if(p->center==NULL)
            error(EXIT_FAILURE, 0, "no coordinate specified! Please use "
                  "'--center' to specify the RA and Dec (in J2000) of "
                  "your desired coordinate, for example "
                  "--center=10.68458,41.269166");
        }
    }
  else
    error(EXIT_FAILURE, 0, "no dataset specified! Query only recognizes "
          "two datasets for NED: 'objdir' and 'extinction'. 'objdir' "
          "is in the IVOA Table Access Protocol (TAP) format, so you "
          "can see its available columns before downloading the actual "
          "data (to only download the small sub-set you need) with this "
          "command: 'astquery %s --dataset=objdir --info'. However, the "
          "'extinction' catalog isn't TAP-based, so the '--info' option "
          "isn't supported (but by its nature, the size of the "
          "extinction catalog is very small)", p->databasestr);

  /* Currently NED only has a single table for TAP access, so warn the
     users about this if they ask for any other table. */
  if( p->usetap
      && ( p->datasetuse==NULL
           || strcmp(p->datasetuse, "NEDTAP.objdir") ) )
    error(EXIT_FAILURE, 0, "NED currently only supports a single "
          "dataset with the TAP protocol called 'NEDTAP.objdir' "
          "(which you can also call in Query with '--dataset=objdir'). "
          "TAP access to more datasets/tables will be provided in "
          "the future. To see all the column information and select "
          "the columns you want for your work, please run this command:\n\n"
          "    astquery %s --dataset=objdir --info", p->databasestr);
}





/* Extinction with NED */
void
ned_extinction(struct queryparams *p)
{
  double *darr;
  char *command;

  /* If the user wants information, we'll specify a (0,0) center coordinate
     and continue. In the end, instead of saving the file, we'll just
     report the metadata. */
  if(p->information)
    error(EXIT_FAILURE, 0, "'--information' is not yet supported for "
          "NED's extinction calculator");

  /* Build the calling command. Note that the query quotes are
     included by the function building it. */
  darr=p->center->array;
  if( asprintf(&command, "curl%s -o%s 'https://ned.ipac.caltech.edu/cgi-bin/calc?in_csys=Equatorial&out_csys=Equatorial&in_equinox=J2000.0&out_equinox=J2000.0&obs_epoch=2000.0&lon=%fd&lat=%fd&of=xml_main&ext=1'", p->cp.quiet ? " -s" : "",
               p->downloadname, darr[0], darr[1])<0 )
    error(EXIT_FAILURE, 0, "%s: asprintf allocation ('command')",
          __func__);

  /* Print the calling command for the user to know. */
  if(p->dryrun==1 || p->cp.quiet==0)
    {
      if(p->dryrun==0) printf("\n");
      error(EXIT_SUCCESS, 0, "%s: %s",
            p->dryrun ? "would run" : "running", command);
      if(p->dryrun==0) printf("\nDownload status:\n");
    }

  /* Run the command if '--dryrun' isn't called: if the command succeeds
     'system' returns 'EXIT_SUCCESS'. */
  if(p->dryrun==0)
    {
      if(system(command)!=EXIT_SUCCESS)
        error(EXIT_FAILURE, 0, "the query download command %sfailed%s\n",
              p->cp.quiet==0 ? "printed above " : "",
              p->cp.quiet==0 ? "" : " (the command can be printed "
              "if you don't use the option '--quiet', or '-q')");
    }
}





/* For NED's non-TAP queries. */
void
ned_non_tap(struct queryparams *p)
{
  if( !strcmp(p->datasetuse, "extinction") )
    ned_extinction(p);
}





void
ned_prepare(struct queryparams *p)
{
  /* NED-specific. */
  ned_sanity_checks(p);

  /* If we should use TAP, do the preparations. */
  if(p->usetap)
    {
      /* Set the URLs, note that this is a simply-linked list, so we need
         to reverse it in the end (with 'gal_list_str_reverse') to have the
         same order here. */
      gal_list_str_add(&p->urls,
                       "https://ned.ipac.caltech.edu/tap/sync", 0);

      /* Name of default RA Dec columns. */
      if(p->ra_name==NULL)  p->ra_name="ra";
      if(p->dec_name==NULL) p->dec_name="dec";

      /* Basic sanity checks. */
      tap_sanity_checks(p);
    }
  else
    ned_non_tap(p);
}