GammaLib 2.0.0
Loading...
Searching...
No Matches
GVOTable.cpp
Go to the documentation of this file.
1/***************************************************************************
2 * GVOTable.cpp - VO table class *
3 * ----------------------------------------------------------------------- *
4 * copyright (C) 2015-2016 by Thierry Louge *
5 * ----------------------------------------------------------------------- *
6 * *
7 * This program is free software: you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation, either version 3 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
19 * *
20 ***************************************************************************/
21/**
22 * @file GVOTable.cpp
23 * @brief VO table class implementation
24 * @author Thierry Louge
25 */
26
27/* __ Includes ___________________________________________________________ */
28#ifdef HAVE_CONFIG_H
29#include <config.h>
30#endif
31#include "GVOTable.hpp"
32#include "GXmlElement.hpp"
33#include "GFitsCfitsio.hpp"
34#include "GFitsTable.hpp"
35#include "GFitsTableCol.hpp"
36
37/* __ Method name definitions ____________________________________________ */
38
39/* __ Macros _____________________________________________________________ */
40
41/* __ Coding definitions _________________________________________________ */
42
43/* __ Debug definitions __________________________________________________ */
44
45
46/*==========================================================================
47 = =
48 = Constructors/destructors =
49 = =
50 ==========================================================================*/
51
52/***********************************************************************//**
53 * @brief Void constructor
54 ***************************************************************************/
56{
57 // Initialise members
59
60 // Return
61 return;
62}
63
64
65/***********************************************************************//**
66 * @brief FITS table constructor
67 *
68 * @param[in] table FITS table
69 ***************************************************************************/
71{
72 // Initialise members
74
75 // Read VO table from FITS table
76 read(table);
77
78 // Return
79 return;
80}
81
82
83/***********************************************************************//**
84 * @brief Copy constructor
85 *
86 * @param[in] votable VO table
87 ***************************************************************************/
89{
90 // Initialise members
92
93 // Copy members
94 copy_members(votable);
95
96 // Return
97 return;
98}
99
100
101/***********************************************************************//**
102 * @brief Destructor
103 ***************************************************************************/
105{
106 // Free members
107 free_members();
108
109 // Return
110 return;
111}
112
113
114/*==========================================================================
115 = =
116 = Operators =
117 = =
118 ==========================================================================*/
119
120/***********************************************************************//**
121 * @brief Assignment operator
122 *
123 * @param[in] votable VO table.
124 * @return VO table.
125 ***************************************************************************/
127{
128 // Execute only if object is not identical
129 if (this != &votable) {
130
131 // Free members
132 free_members();
133
134 // Initialise members
135 init_members();
136
137 // Copy members
138 copy_members(votable);
139
140 } // endif: object was not identical
141
142 // Return
143 return *this;
144}
145
146
147/*==========================================================================
148 = =
149 = Public methods =
150 = =
151 ==========================================================================*/
152
153/***********************************************************************//**
154 * @brief Clear object.
155 *
156 * Reset object to a clean initial state.
157 ***************************************************************************/
159{
160 // Free members
161 free_members();
162
163 // Initialise members
164 init_members();
165
166 // Return
167 return;
168}
169
170
171/***********************************************************************//**
172 * @brief Clone object
173 ***************************************************************************/
175{
176 // Clone client
177 return new GVOTable(*this);
178}
179
180
181/***********************************************************************//**
182 * @brief Read VO table from FITS table
183 ***************************************************************************/
184void GVOTable::read(const GFitsTable& table)
185{
186 // Clear VO table
187 m_xml.clear();
188
189 // Set name and resource string
190 m_name = table.extname();
191 m_resource = table.classname();
192
193 // Set VOTABLE element string
194 std::string s1("VOTABLE version=\"1.3\" xmlns:xsi=\"http://www.w3.org/"
195 "2001/XMLSchema-instance\" xmlns=\"http://www.ivoa.net/"
196 "xml/VOTable/v1.3\" xmlns:stc=\"http://www.ivoa.net/xml/"
197 "STC/v1.30\"");
198 std::string s2("RESOURCE name=\""+m_resource+"\"");
199 std::string s3("TABLE name=\""+m_name+"\"");
200
201 // Create table element
202 GXmlElement* votable = m_xml.append(s1)->append(s2)->append(s3);
203
204 // Append description
205 votable->append("DESCRIPTION")->append(GXmlText(m_description));
206
207 // Append FIELD elements by extracting the information from the FITS
208 // columns
209 for (int i = 0; i < table.ncols(); ++i) {
210 votable->append(field_from_fits_column(*table[i]));
211 }
212
213 // Append data
214 votable->append(data_from_fits_table(table));
215
216 // Return
217 return;
218}
219
220
221/***********************************************************************//**
222 * @brief Print VO Table information
223 *
224 * @param[in] chatter Chattiness.
225 * @return String containing VO table information.
226 ***************************************************************************/
227std::string GVOTable::print(const GChatter& chatter) const
228{
229 // Initialise result string
230 std::string result;
231
232 // Continue only if chatter is not silent
233 if (chatter != SILENT) {
234
235 // Append VO table
236 result.append("=== GVOTable ===");
237 result.append(m_xml.print(chatter, 0));
238
239 } // endif: chatter was not silent
240
241 // Return result
242 return result;
243}
244
245
246/*==========================================================================
247 = =
248 = Private methods =
249 = =
250 ==========================================================================*/
251
252/***********************************************************************//**
253 * @brief Initialise class members
254 ***************************************************************************/
256{
257 // Initialise members
258 m_xml.clear();
259 m_name.clear();
260 m_resource.clear();
261 m_description.clear();
262
263 // Return
264 return;
265}
266
267
268/***********************************************************************//**
269 * @brief Copy class members
270 *
271 * @param[in] table VO table.
272 ***************************************************************************/
274{
275 // Copy members
276 m_xml = table.m_xml;
277 m_name = table.m_name;
278 m_resource = table.m_resource;
280
281 // Return
282 return;
283}
284
285
286/***********************************************************************//**
287 * @brief Delete class members
288 ***************************************************************************/
290{
291 // Return
292 return;
293}
294
295
296/***********************************************************************//**
297 * @brief Return FIELD element with column description
298 *
299 * @param[in] column FITS column
300 * @return XML FIELD element with column description
301 ***************************************************************************/
303{
304 // Create FIELD element
305 GXmlElement field("FIELD");
306
307 // Set datatype
308 std::string datatype;
309 switch (column.type()) {
310 case __TLOGICAL:
311 datatype = "boolean";
312 break;
313 case __TBIT:
314 datatype = "bit";
315 break;
316 case __TBYTE:
317 case __TSBYTE:
318 datatype = "unsignedByte";
319 break;
320 case __TSHORT:
321 case __TUSHORT:
322 datatype = "short";
323 break;
324 case __TINT:
325 case __TUINT:
326 datatype = "int";
327 break;
328 case __TLONG:
329 case __TULONG:
330 case __TLONGLONG:
331 datatype = "long";
332 break;
333 case __TSTRING:
334 datatype = "char";
335 break;
336 case __TFLOAT:
337 datatype = "float";
338 break;
339 case __TDOUBLE:
340 datatype = "double";
341 break;
342 case __TCOMPLEX:
343 datatype = "floatComplex";
344 break;
345 case __TDBLCOMPLEX:
346 datatype = "doubleComplex";
347 break;
348 default:
349 datatype = "unknown";
350 break;
351 }
352
353 // Set FIELD attributes
354 field.attribute("name", column.name());
355 field.attribute("ID", "col"+gammalib::str(column.colnum()+1));
356 field.attribute("datatype", datatype);
357 field.attribute("unit", column.unit());
358
359 // Return XML FIELD element
360 return field;
361}
362
363
364/***********************************************************************//**
365 * @brief Return DATA element with FITS table data
366 *
367 * @param[in] table FITS table
368 * @return XML DATA element with FITS data
369 ***************************************************************************/
371{
372 // Create DATA element and append TABLEDATA element
373 GXmlElement data("DATA");
374 GXmlElement* tabledata = data.append("TABLEDATA");
375
376 // Loop over all rows
377 for (int row = 0; row < table.nrows(); ++row) {
378
379 // Create TR element
380 GXmlElement tr("TR");
381
382 // Append all column data
383 for (int col = 0; col < table.ncols(); ++col) {
384
385 // Create TD element
386 GXmlElement td("TD");
387
388 // Set column data as text of TD element
389 td.append(GXmlText(table[col]->string(row)));
390
391 // Append TD element to TR element
392 tr.append(td);
393
394 } // endfor: looped over columns
395
396 // Append TR element to TABLEDATA
397 tabledata->append(tr);
398
399 } // endfor: looped over rows
400
401 // Return XML DATA element
402 return data;
403}
CFITSIO interface header.
#define __TLONG
#define __TLOGICAL
#define __TLONGLONG
#define __TSHORT
#define __TDBLCOMPLEX
#define __TBYTE
#define __TULONG
#define __TSTRING
#define __TFLOAT
#define __TDOUBLE
#define __TINT
#define __TUSHORT
#define __TSBYTE
#define __TCOMPLEX
#define __TUINT
#define __TBIT
FITS table column abstract base class definition.
FITS table abstract base class interface definition.
GChatter
Definition GTypemaps.hpp:33
@ SILENT
Definition GTypemaps.hpp:34
VO table class definition.
XML element node class interface definition.
const std::string & extname(void) const
Return extension name.
Definition GFitsHDU.hpp:162
Abstract interface for FITS table column.
void type(const int &type)
Set type code.
void name(const std::string &name)
Set column name.
void colnum(const int &colnum)
Set column number.
void unit(const std::string &unit)
Set column unit.
Abstract interface for FITS table.
const int & nrows(void) const
Return number of rows in table.
const int & ncols(void) const
Return number of columns in table.
virtual std::string classname(void) const =0
Return class name.
VOTable class.
Definition GVOTable.hpp:55
std::string print(const GChatter &chatter=NORMAL) const
Print VO Table information.
Definition GVOTable.cpp:227
GVOTable & operator=(const GVOTable &votable)
Assignment operator.
Definition GVOTable.cpp:126
virtual ~GVOTable(void)
Destructor.
Definition GVOTable.cpp:104
GXmlElement field_from_fits_column(const GFitsTableCol &column) const
Return FIELD element with column description.
Definition GVOTable.cpp:302
GXml m_xml
VO table.
Definition GVOTable.hpp:85
GVOTable * clone(void) const
Clone object.
Definition GVOTable.cpp:174
GVOTable(void)
Void constructor.
Definition GVOTable.cpp:55
void free_members(void)
Delete class members.
Definition GVOTable.cpp:289
std::string m_description
VO table description.
Definition GVOTable.hpp:88
void init_members(void)
Initialise class members.
Definition GVOTable.cpp:255
void clear(void)
Clear object.
Definition GVOTable.cpp:158
void copy_members(const GVOTable &table)
Copy class members.
Definition GVOTable.cpp:273
std::string m_name
VO table name.
Definition GVOTable.hpp:86
void read(const GFitsTable &table)
Read VO table from FITS table.
Definition GVOTable.cpp:184
std::string m_resource
VO resource name.
Definition GVOTable.hpp:87
GXmlElement data_from_fits_table(const GFitsTable &table) const
Return DATA element with FITS table data.
Definition GVOTable.cpp:370
XML element node class.
const GXmlAttribute * attribute(const int &index) const
Return attribute.
virtual GXmlNode * append(const GXmlNode &node)
Append XML child node.
Definition GXmlNode.cpp:287
XML text node class.
Definition GXmlText.hpp:43
void clear(void)
Clear XML object.
Definition GXml.cpp:232
GXmlNode * append(const GXmlNode &node)
Append child node to XML document root.
Definition GXml.cpp:279
std::string print(const GChatter &chatter=NORMAL) const
Print XML object.
Definition GXml.cpp:674
std::string str(const unsigned short int &value)
Convert unsigned short integer value into string.
Definition GTools.cpp:489