29#include <lal/LALMalloc.h>
30#include <lal/LIGOLwXML.h>
31#include <lal/LIGOLwXMLRead.h>
32#include <lal/LIGOMetadataTables.h>
33#include <lal/LIGOMetadataUtils.h>
34#include <lal/XLALError.h>
50 memset(new->waveform, 0,
sizeof(new->waveform));
51 memset(new->coordinates, 0,
sizeof(new->coordinates));
95 static const char table_name[] =
"sim_ringdown";
99 struct MetaioParseEnvironment env;
104 int geocent_start_time;
105 int geocent_start_time_ns;
136 if(MetaioOpenFile(&env,
filename)) {
137 XLALPrintError(
"%s(): error opening \"%s\": %s\n", __func__,
filename, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
140 if(MetaioOpenTableOnly(&env, table_name)) {
142 XLALPrintError(
"%s(): cannot find %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
152 column_pos.geocent_start_time =
XLALLIGOLwFindColumn(&env,
"geocent_start_time", METAIO_TYPE_INT_4S, 1);
153 column_pos.geocent_start_time_ns =
XLALLIGOLwFindColumn(&env,
"geocent_start_time_ns", METAIO_TYPE_INT_4S, 1);
155 column_pos.h_start_time_ns =
XLALLIGOLwFindColumn(&env,
"h_start_time_ns", METAIO_TYPE_INT_4S, 1);
157 column_pos.l_start_time_ns =
XLALLIGOLwFindColumn(&env,
"l_start_time_ns", METAIO_TYPE_INT_4S, 1);
159 column_pos.v_start_time_ns =
XLALLIGOLwFindColumn(&env,
"v_start_time_ns", METAIO_TYPE_INT_4S, 1);
160 column_pos.start_time_gmst =
XLALLIGOLwFindColumn(&env,
"start_time_gmst", METAIO_TYPE_REAL_8, 1);
185 XLALPrintError(
"%s(): failure reading %s table\n", __func__, table_name);
191 while((miostatus = MetaioGetRow(&env)) > 0) {
205 next = &(*next)->
next;
210 strncpy(row->
waveform, env.ligo_lw.table.elt[column_pos.waveform].data.lstring.data,
sizeof(row->
waveform) - 1);
211 strncpy(row->
coordinates, env.ligo_lw.table.elt[column_pos.coordinates].data.lstring.data,
sizeof(row->
coordinates) - 1);
212 XLALGPSSet(&row->
geocent_start_time, env.ligo_lw.table.elt[column_pos.geocent_start_time].data.int_4s, env.ligo_lw.table.elt[column_pos.geocent_start_time_ns].data.int_4s);
213 XLALGPSSet(&row->
h_start_time, env.ligo_lw.table.elt[column_pos.h_start_time].data.int_4s, env.ligo_lw.table.elt[column_pos.h_start_time_ns].data.int_4s);
214 XLALGPSSet(&row->
l_start_time, env.ligo_lw.table.elt[column_pos.l_start_time].data.int_4s, env.ligo_lw.table.elt[column_pos.l_start_time_ns].data.int_4s);
215 XLALGPSSet(&row->
v_start_time, env.ligo_lw.table.elt[column_pos.v_start_time].data.int_4s, env.ligo_lw.table.elt[column_pos.v_start_time_ns].data.int_4s);
216 row->
start_time_gmst = env.ligo_lw.table.elt[column_pos.start_time_gmst].data.real_8;
217 row->
longitude = env.ligo_lw.table.elt[column_pos.longitude].data.real_4;
218 row->
latitude = env.ligo_lw.table.elt[column_pos.latitude].data.real_4;
219 row->
distance = env.ligo_lw.table.elt[column_pos.distance].data.real_4;
220 row->
inclination = env.ligo_lw.table.elt[column_pos.inclination].data.real_4;
221 row->
polarization = env.ligo_lw.table.elt[column_pos.polarization].data.real_4;
222 row->
frequency = env.ligo_lw.table.elt[column_pos.frequency].data.real_4;
223 row->
quality = env.ligo_lw.table.elt[column_pos.quality].data.real_4;
224 row->
phase = env.ligo_lw.table.elt[column_pos.phase].data.real_4;
225 row->
mass = env.ligo_lw.table.elt[column_pos.mass].data.real_4;
226 row->
spin = env.ligo_lw.table.elt[column_pos.spin].data.real_4;
227 row->
epsilon = env.ligo_lw.table.elt[column_pos.epsilon].data.real_4;
228 row->
amplitude = env.ligo_lw.table.elt[column_pos.amplitude].data.real_4;
229 row->
eff_dist_h = env.ligo_lw.table.elt[column_pos.eff_dist_h].data.real_4;
230 row->
eff_dist_l = env.ligo_lw.table.elt[column_pos.eff_dist_l].data.real_4;
231 row->
eff_dist_v = env.ligo_lw.table.elt[column_pos.eff_dist_v].data.real_4;
232 row->
hrss = env.ligo_lw.table.elt[column_pos.hrss].data.real_4;
233 row->
hrss_h = env.ligo_lw.table.elt[column_pos.hrss_h].data.real_4;
234 row->
hrss_l = env.ligo_lw.table.elt[column_pos.hrss_l].data.real_4;
235 row->
hrss_v = env.ligo_lw.table.elt[column_pos.hrss_v].data.real_4;
240 XLALPrintError(
"%s(): I/O error parsing %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
246 if(MetaioClose(&env)) {
248 XLALPrintError(
"%s(): error parsing document after %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
267 const char *row_head =
"\n\t\t\t";
272 XLALFilePuts(
"\t<Table Name=\"sim_ringdown:table\">\n" , xml->
fp);
273 XLALFilePuts(
"\t\t<Column Name=\"process:process_id\" Type=\"ilwd:char\"/>\n", xml->
fp);
274 XLALFilePuts(
"\t\t<Column Name=\"waveform\" Type=\"lstring\"/>\n" , xml->
fp);
275 XLALFilePuts(
"\t\t<Column Name=\"coordinates\" Type=\"lstring\"/>\n" , xml->
fp);
276 XLALFilePuts(
"\t\t<Column Name=\"geocent_start_time\" Type=\"int_4s\"/>\n" , xml->
fp);
277 XLALFilePuts(
"\t\t<Column Name=\"geocent_start_time_ns\" Type=\"int_4s\"/>\n" , xml->
fp);
278 XLALFilePuts(
"\t\t<Column Name=\"h_start_time\" Type=\"int_4s\"/>\n" , xml->
fp);
279 XLALFilePuts(
"\t\t<Column Name=\"h_start_time_ns\" Type=\"int_4s\"/>\n" , xml->
fp);
280 XLALFilePuts(
"\t\t<Column Name=\"l_start_time\" Type=\"int_4s\"/>\n" , xml->
fp);
281 XLALFilePuts(
"\t\t<Column Name=\"l_start_time_ns\" Type=\"int_4s\"/>\n" , xml->
fp);
282 XLALFilePuts(
"\t\t<Column Name=\"v_start_time\" Type=\"int_4s\"/>\n" , xml->
fp);
283 XLALFilePuts(
"\t\t<Column Name=\"v_start_time_ns\" Type=\"int_4s\"/>\n" , xml->
fp);
284 XLALFilePuts(
"\t\t<Column Name=\"start_time_gmst\" Type=\"real_8\"/>\n" , xml->
fp);
285 XLALFilePuts(
"\t\t<Column Name=\"longitude\" Type=\"real_4\"/>\n" , xml->
fp);
286 XLALFilePuts(
"\t\t<Column Name=\"latitude\" Type=\"real_4\"/>\n" , xml->
fp);
287 XLALFilePuts(
"\t\t<Column Name=\"distance\" Type=\"real_4\"/>\n" , xml->
fp);
288 XLALFilePuts(
"\t\t<Column Name=\"inclination\" Type=\"real_4\"/>\n" , xml->
fp);
289 XLALFilePuts(
"\t\t<Column Name=\"polarization\" Type=\"real_4\"/>\n" , xml->
fp);
290 XLALFilePuts(
"\t\t<Column Name=\"frequency\" Type=\"real_4\"/>\n" , xml->
fp);
291 XLALFilePuts(
"\t\t<Column Name=\"quality\" Type=\"real_4\"/>\n" , xml->
fp);
292 XLALFilePuts(
"\t\t<Column Name=\"phase\" Type=\"real_4\"/>\n" , xml->
fp);
293 XLALFilePuts(
"\t\t<Column Name=\"mass\" Type=\"real_4\"/>\n" , xml->
fp);
294 XLALFilePuts(
"\t\t<Column Name=\"spin\" Type=\"real_4\"/>\n" , xml->
fp);
295 XLALFilePuts(
"\t\t<Column Name=\"epsilon\" Type=\"real_4\"/>\n" , xml->
fp);
296 XLALFilePuts(
"\t\t<Column Name=\"amplitude\" Type=\"real_4\"/>\n" , xml->
fp);
297 XLALFilePuts(
"\t\t<Column Name=\"eff_dist_h\" Type=\"real_4\"/>\n" , xml->
fp);
298 XLALFilePuts(
"\t\t<Column Name=\"eff_dist_l\" Type=\"real_4\"/>\n" , xml->
fp);
299 XLALFilePuts(
"\t\t<Column Name=\"eff_dist_v\" Type=\"real_4\"/>\n" , xml->
fp);
300 XLALFilePuts(
"\t\t<Column Name=\"hrss\" Type=\"real_4\"/>\n" , xml->
fp);
301 XLALFilePuts(
"\t\t<Column Name=\"hrss_h\" Type=\"real_4\"/>\n" , xml->
fp);
302 XLALFilePuts(
"\t\t<Column Name=\"hrss_l\" Type=\"real_4\"/>\n" , xml->
fp);
303 XLALFilePuts(
"\t\t<Column Name=\"hrss_v\" Type=\"real_4\"/>\n" , xml->
fp);
304 XLALFilePuts(
"\t\t<Column Name=\"simulation_id\" Type=\"ilwd:char\"/>\n" , xml->
fp);
305 XLALFilePuts(
"\t\t<Stream Name=\"sim_ringdown:table\" Type=\"Local\" Delimiter=\",\">\n", xml->
fp);
311 for(; sim_ringdown; sim_ringdown = sim_ringdown->
next) {
312 if(
XLALFilePrintf(xml->
fp,
"%s%ld,\"%s\",\"%s\",%d,%d,%d,%d,%d,%d,%d,%d,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%ld",
348 row_head =
",\n\t\t\t";
int XLALLIGOLwFindColumn(struct MetaioParseEnvironment *env, const char *name, unsigned int type, int required)
Convenience wrapper for MetaioFindColumn(), translating to XLAL-style error reporting and printing us...
int XLALFilePuts(const char *s, LALFILE *file)
int XLALFilePrintf(LALFILE *file, const char *fmt,...)
void * XLALMalloc(size_t n)
#define XLAL_ERROR_NULL(...)
int XLALGetBaseErrno(void)
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
LIGOTimeGPS * XLALGPSSet(LIGOTimeGPS *epoch, INT4 gpssec, INT8 gpsnan)
int XLALWriteLIGOLwXMLSimRingdownTable(LIGOLwXMLStream *xml, const SimRingdownTable *sim_ringdown)
Write a sim_ringdown table to an XML file.
void XLALDestroySimRingdownTable(SimRingdownTable *head)
Destroy a SimRingdownTable linked list.
SimRingdownTable * XLALSimRingdownTableFromLIGOLw(const char *filename)
Read the sim_ringdown table from a LIGO Light Weight XML file into a linked list of SimRingdownTable ...
SimRingdownTable * XLALCreateSimRingdownTableRow(const ProcessTable *process)
Create a SimRingdownTable structure.
SimRingdownTable * XLALDestroySimRingdownTableRow(SimRingdownTable *row)
Destroy a SimRingdownTable structure.
This structure contains the file stream and current table type for writing to LIGO lightweight XML fi...
This structure contains the required information for generating a ringdown injection.
CHAR waveform[LIGOMETA_WAVEFORM_MAX]
struct tagSimRingdownTable * next
LIGOTimeGPS geocent_start_time
CHAR coordinates[LIGOMETA_COORDINATES_MAX]