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->source, 0,
sizeof(new->source));
52 memset(new->numrel_data, 0,
sizeof(new->numrel_data));
53 memset(new->taper, 0,
sizeof(new->taper));
58 new->simulation_id = -1;
103 for(; head; head = head->
next) {
107 return simulation_id;
119 static const char table_name[] =
"sim_inspiral";
123 struct MetaioParseEnvironment env;
127 int geocent_end_time;
128 int geocent_end_time_ns;
187 if(MetaioOpenFile(&env,
filename)) {
188 XLALPrintError(
"%s(): error opening \"%s\": %s\n", __func__,
filename, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
191 if(MetaioOpenTableOnly(&env, table_name)) {
193 XLALPrintError(
"%s(): cannot find %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
202 column_pos.geocent_end_time =
XLALLIGOLwFindColumn(&env,
"geocent_end_time", METAIO_TYPE_INT_4S, 1);
203 column_pos.geocent_end_time_ns =
XLALLIGOLwFindColumn(&env,
"geocent_end_time_ns", METAIO_TYPE_INT_4S, 1);
251 column_pos.numrel_mode_min =
XLALLIGOLwFindColumn(&env,
"numrel_mode_min", METAIO_TYPE_INT_4S, 1);
252 column_pos.numrel_mode_max =
XLALLIGOLwFindColumn(&env,
"numrel_mode_max", METAIO_TYPE_INT_4S, 1);
263 XLALPrintError(
"%s(): failure reading %s table\n", __func__, table_name);
269 while((miostatus = MetaioGetRow(&env)) > 0) {
283 next = &(*next)->
next;
287 row->
process_id = env.ligo_lw.table.elt[column_pos.process_id].data.int_8s;
288 strncpy(row->
waveform, env.ligo_lw.table.elt[column_pos.waveform].data.lstring.data,
sizeof(row->
waveform) - 1);
289 strncpy(row->
source, env.ligo_lw.table.elt[column_pos.source].data.lstring.data,
sizeof(row->
source) - 1);
290 XLALGPSSet(&row->
geocent_end_time, env.ligo_lw.table.elt[column_pos.geocent_end_time].data.int_4s, env.ligo_lw.table.elt[column_pos.geocent_end_time_ns].data.int_4s);
291 XLALGPSSet(&row->
h_end_time, env.ligo_lw.table.elt[column_pos.h_end_time].data.int_4s, env.ligo_lw.table.elt[column_pos.h_end_time_ns].data.int_4s);
292 XLALGPSSet(&row->
l_end_time, env.ligo_lw.table.elt[column_pos.l_end_time].data.int_4s, env.ligo_lw.table.elt[column_pos.l_end_time_ns].data.int_4s);
293 XLALGPSSet(&row->
g_end_time, env.ligo_lw.table.elt[column_pos.g_end_time].data.int_4s, env.ligo_lw.table.elt[column_pos.g_end_time_ns].data.int_4s);
294 XLALGPSSet(&row->
t_end_time, env.ligo_lw.table.elt[column_pos.t_end_time].data.int_4s, env.ligo_lw.table.elt[column_pos.t_end_time_ns].data.int_4s);
295 XLALGPSSet(&row->
v_end_time, env.ligo_lw.table.elt[column_pos.v_end_time].data.int_4s, env.ligo_lw.table.elt[column_pos.v_end_time_ns].data.int_4s);
296 row->
end_time_gmst = env.ligo_lw.table.elt[column_pos.end_time_gmst].data.real_8;
297 row->
mass1 = env.ligo_lw.table.elt[column_pos.mass1].data.real_4;
298 row->
mass2 = env.ligo_lw.table.elt[column_pos.mass2].data.real_4;
299 row->
eta = env.ligo_lw.table.elt[column_pos.eta].data.real_4;
300 row->
distance = env.ligo_lw.table.elt[column_pos.distance].data.real_4;
301 row->
longitude = env.ligo_lw.table.elt[column_pos.longitude].data.real_4;
302 row->
latitude = env.ligo_lw.table.elt[column_pos.latitude].data.real_4;
303 row->
inclination = env.ligo_lw.table.elt[column_pos.inclination].data.real_4;
304 row->
coa_phase = env.ligo_lw.table.elt[column_pos.coa_phase].data.real_4;
305 row->
polarization = env.ligo_lw.table.elt[column_pos.polarization].data.real_4;
306 row->
psi0 = env.ligo_lw.table.elt[column_pos.psi0].data.real_4;
307 row->
psi3 = env.ligo_lw.table.elt[column_pos.psi3].data.real_4;
308 row->
alpha = env.ligo_lw.table.elt[column_pos.alpha].data.real_4;
309 row->
alpha1 = env.ligo_lw.table.elt[column_pos.alpha1].data.real_4;
310 row->
alpha2 = env.ligo_lw.table.elt[column_pos.alpha2].data.real_4;
311 row->
alpha3 = env.ligo_lw.table.elt[column_pos.alpha3].data.real_4;
312 row->
alpha4 = env.ligo_lw.table.elt[column_pos.alpha4].data.real_4;
313 row->
alpha5 = env.ligo_lw.table.elt[column_pos.alpha5].data.real_4;
314 row->
alpha6 = env.ligo_lw.table.elt[column_pos.alpha6].data.real_4;
315 row->
beta = env.ligo_lw.table.elt[column_pos.beta].data.real_4;
316 row->
spin1x = env.ligo_lw.table.elt[column_pos.spin1x].data.real_4;
317 row->
spin1y = env.ligo_lw.table.elt[column_pos.spin1y].data.real_4;
318 row->
spin1z = env.ligo_lw.table.elt[column_pos.spin1z].data.real_4;
319 row->
spin2x = env.ligo_lw.table.elt[column_pos.spin2x].data.real_4;
320 row->
spin2y = env.ligo_lw.table.elt[column_pos.spin2y].data.real_4;
321 row->
spin2z = env.ligo_lw.table.elt[column_pos.spin2z].data.real_4;
322 row->
theta0 = env.ligo_lw.table.elt[column_pos.theta0].data.real_4;
323 row->
phi0 = env.ligo_lw.table.elt[column_pos.phi0].data.real_4;
324 row->
f_lower = env.ligo_lw.table.elt[column_pos.f_lower].data.real_4;
325 row->
f_final = env.ligo_lw.table.elt[column_pos.f_final].data.real_4;
326 row->
mchirp = env.ligo_lw.table.elt[column_pos.mchirp].data.real_4;
327 row->
eff_dist_h = env.ligo_lw.table.elt[column_pos.eff_dist_h].data.real_4;
328 row->
eff_dist_l = env.ligo_lw.table.elt[column_pos.eff_dist_l].data.real_4;
329 row->
eff_dist_g = env.ligo_lw.table.elt[column_pos.eff_dist_g].data.real_4;
330 row->
eff_dist_t = env.ligo_lw.table.elt[column_pos.eff_dist_t].data.real_4;
331 row->
eff_dist_v = env.ligo_lw.table.elt[column_pos.eff_dist_v].data.real_4;
332 row->
numrel_mode_min = env.ligo_lw.table.elt[column_pos.numrel_mode_min].data.int_4s;
333 row->
numrel_mode_max = env.ligo_lw.table.elt[column_pos.numrel_mode_max].data.int_4s;
334 strncpy(row->
numrel_data, env.ligo_lw.table.elt[column_pos.numrel_data].data.lstring.data,
sizeof(row->
numrel_data) - 1);
335 row->
amp_order = env.ligo_lw.table.elt[column_pos.amp_order].data.int_4s;
336 strncpy(row->
taper, env.ligo_lw.table.elt[column_pos.taper].data.lstring.data,
sizeof(row->
taper) - 1);
337 row->
bandpass = env.ligo_lw.table.elt[column_pos.bandpass].data.int_4s;
338 row->
simulation_id = env.ligo_lw.table.elt[column_pos.simulation_id].data.int_8s;
343 XLALPrintError(
"%s(): I/O error parsing %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
349 if(MetaioClose(&env)) {
351 XLALPrintError(
"%s(): error parsing document after %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
370 const char *row_head =
"\n\t\t\t";
376 XLALFilePuts(
"\t\t<Column Name=\"process:process_id\" Type=\"int_8s\"/>\n", xml->
fp);
377 XLALFilePuts(
"\t\t<Column Name=\"waveform\" Type=\"lstring\"/>\n", xml->
fp);
378 XLALFilePuts(
"\t\t<Column Name=\"geocent_end_time\" Type=\"int_4s\"/>\n", xml->
fp);
379 XLALFilePuts(
"\t\t<Column Name=\"geocent_end_time_ns\" Type=\"int_4s\"/>\n", xml->
fp);
380 XLALFilePuts(
"\t\t<Column Name=\"h_end_time\" Type=\"int_4s\"/>\n", xml->
fp);
381 XLALFilePuts(
"\t\t<Column Name=\"h_end_time_ns\" Type=\"int_4s\"/>\n", xml->
fp);
382 XLALFilePuts(
"\t\t<Column Name=\"l_end_time\" Type=\"int_4s\"/>\n", xml->
fp);
383 XLALFilePuts(
"\t\t<Column Name=\"l_end_time_ns\" Type=\"int_4s\"/>\n", xml->
fp);
384 XLALFilePuts(
"\t\t<Column Name=\"g_end_time\" Type=\"int_4s\"/>\n", xml->
fp);
385 XLALFilePuts(
"\t\t<Column Name=\"g_end_time_ns\" Type=\"int_4s\"/>\n", xml->
fp);
386 XLALFilePuts(
"\t\t<Column Name=\"t_end_time\" Type=\"int_4s\"/>\n", xml->
fp);
387 XLALFilePuts(
"\t\t<Column Name=\"t_end_time_ns\" Type=\"int_4s\"/>\n", xml->
fp);
388 XLALFilePuts(
"\t\t<Column Name=\"v_end_time\" Type=\"int_4s\"/>\n", xml->
fp);
389 XLALFilePuts(
"\t\t<Column Name=\"v_end_time_ns\" Type=\"int_4s\"/>\n", xml->
fp);
390 XLALFilePuts(
"\t\t<Column Name=\"end_time_gmst\" Type=\"real_8\"/>\n", xml->
fp);
391 XLALFilePuts(
"\t\t<Column Name=\"source\" Type=\"lstring\"/>\n", xml->
fp);
392 XLALFilePuts(
"\t\t<Column Name=\"mass1\" Type=\"real_4\"/>\n", xml->
fp);
393 XLALFilePuts(
"\t\t<Column Name=\"mass2\" Type=\"real_4\"/>\n", xml->
fp);
394 XLALFilePuts(
"\t\t<Column Name=\"mchirp\" Type=\"real_4\"/>\n", xml->
fp);
395 XLALFilePuts(
"\t\t<Column Name=\"eta\" Type=\"real_4\"/>\n", xml->
fp);
396 XLALFilePuts(
"\t\t<Column Name=\"distance\" Type=\"real_4\"/>\n", xml->
fp);
397 XLALFilePuts(
"\t\t<Column Name=\"longitude\" Type=\"real_4\"/>\n", xml->
fp);
398 XLALFilePuts(
"\t\t<Column Name=\"latitude\" Type=\"real_4\"/>\n", xml->
fp);
399 XLALFilePuts(
"\t\t<Column Name=\"inclination\" Type=\"real_4\"/>\n", xml->
fp);
400 XLALFilePuts(
"\t\t<Column Name=\"coa_phase\" Type=\"real_4\"/>\n", xml->
fp);
401 XLALFilePuts(
"\t\t<Column Name=\"polarization\" Type=\"real_4\"/>\n", xml->
fp);
402 XLALFilePuts(
"\t\t<Column Name=\"psi0\" Type=\"real_4\"/>\n", xml->
fp);
403 XLALFilePuts(
"\t\t<Column Name=\"psi3\" Type=\"real_4\"/>\n", xml->
fp);
404 XLALFilePuts(
"\t\t<Column Name=\"alpha\" Type=\"real_4\"/>\n", xml->
fp);
405 XLALFilePuts(
"\t\t<Column Name=\"alpha1\" Type=\"real_4\"/>\n", xml->
fp);
406 XLALFilePuts(
"\t\t<Column Name=\"alpha2\" Type=\"real_4\"/>\n", xml->
fp);
407 XLALFilePuts(
"\t\t<Column Name=\"alpha3\" Type=\"real_4\"/>\n", xml->
fp);
408 XLALFilePuts(
"\t\t<Column Name=\"alpha4\" Type=\"real_4\"/>\n", xml->
fp);
409 XLALFilePuts(
"\t\t<Column Name=\"alpha5\" Type=\"real_4\"/>\n", xml->
fp);
410 XLALFilePuts(
"\t\t<Column Name=\"alpha6\" Type=\"real_4\"/>\n", xml->
fp);
411 XLALFilePuts(
"\t\t<Column Name=\"beta\" Type=\"real_4\"/>\n", xml->
fp);
412 XLALFilePuts(
"\t\t<Column Name=\"spin1x\" Type=\"real_4\"/>\n", xml->
fp);
413 XLALFilePuts(
"\t\t<Column Name=\"spin1y\" Type=\"real_4\"/>\n", xml->
fp);
414 XLALFilePuts(
"\t\t<Column Name=\"spin1z\" Type=\"real_4\"/>\n", xml->
fp);
415 XLALFilePuts(
"\t\t<Column Name=\"spin2x\" Type=\"real_4\"/>\n", xml->
fp);
416 XLALFilePuts(
"\t\t<Column Name=\"spin2y\" Type=\"real_4\"/>\n", xml->
fp);
417 XLALFilePuts(
"\t\t<Column Name=\"spin2z\" Type=\"real_4\"/>\n", xml->
fp);
418 XLALFilePuts(
"\t\t<Column Name=\"theta0\" Type=\"real_4\"/>\n", xml->
fp);
419 XLALFilePuts(
"\t\t<Column Name=\"phi0\" Type=\"real_4\"/>\n", xml->
fp);
420 XLALFilePuts(
"\t\t<Column Name=\"f_lower\" Type=\"real_4\"/>\n", xml->
fp);
421 XLALFilePuts(
"\t\t<Column Name=\"f_final\" Type=\"real_4\"/>\n", xml->
fp);
422 XLALFilePuts(
"\t\t<Column Name=\"eff_dist_h\" Type=\"real_4\"/>\n", xml->
fp);
423 XLALFilePuts(
"\t\t<Column Name=\"eff_dist_l\" Type=\"real_4\"/>\n", xml->
fp);
424 XLALFilePuts(
"\t\t<Column Name=\"eff_dist_g\" Type=\"real_4\"/>\n", xml->
fp);
425 XLALFilePuts(
"\t\t<Column Name=\"eff_dist_t\" Type=\"real_4\"/>\n", xml->
fp);
426 XLALFilePuts(
"\t\t<Column Name=\"eff_dist_v\" Type=\"real_4\"/>\n", xml->
fp);
427 XLALFilePuts(
"\t\t<Column Name=\"numrel_mode_min\" Type=\"int_4s\"/>\n", xml->
fp);
428 XLALFilePuts(
"\t\t<Column Name=\"numrel_mode_max\" Type=\"int_4s\"/>\n", xml->
fp);
429 XLALFilePuts(
"\t\t<Column Name=\"numrel_data\" Type=\"lstring\"/>\n", xml->
fp);
430 XLALFilePuts(
"\t\t<Column Name=\"amp_order\" Type=\"int_4s\"/>\n", xml->
fp);
431 XLALFilePuts(
"\t\t<Column Name=\"taper\" Type=\"lstring\"/>\n", xml->
fp);
432 XLALFilePuts(
"\t\t<Column Name=\"bandpass\" Type=\"int_4s\"/>\n", xml->
fp);
433 XLALFilePuts(
"\t\t<Column Name=\"simulation_id\" Type=\"int_8s\"/>\n", xml->
fp);
434 XLALFilePuts(
"\t\t<Stream Name=\"sim_inspiral:table\" Type=\"Local\" Delimiter=\",\">\n", xml->
fp);
441 for(; sim_inspiral; sim_inspiral = sim_inspiral->
next) {
442 if(
XLALFilePrintf(xml->
fp,
"%s%ld,\"%s\",%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%.16g,\"%s\",%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%.16g,%16g,%d,%d,\"%s\",%d,\"%s\",%d,%ld",
504 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)
void XLALDestroySimInspiralTable(SimInspiralTable *head)
Destroy a SimInspiralTable linked list.
SimInspiralTable * XLALCreateSimInspiralTableRow(const ProcessTable *process)
Create a SimInspiralTable structure.
long XLALSimInspiralAssignIDs(SimInspiralTable *head, long process_id, long simulation_id)
Assign simulation_id values to the entries in a SimInspiral linked list.
SimInspiralTable * XLALDestroySimInspiralTableRow(SimInspiralTable *row)
Destroy a SimInspiralTable structure.
SimInspiralTable * XLALSimInspiralTableFromLIGOLw(const char *filename)
Read the sim_inspiral table from a LIGO Light Weight XML file into a linked list of SimInspiralTable ...
int XLALWriteLIGOLwXMLSimInspiralTable(LIGOLwXMLStream *xml, const SimInspiralTable *sim_inspiral)
Write a sim_inspiral table to an XML file.
This structure contains the file stream and current table type for writing to LIGO lightweight XML fi...
LIGOTimeGPS geocent_end_time
CHAR source[LIGOMETA_SOURCE_MAX]
struct tagSimInspiralTable * next
CHAR taper[LIGOMETA_INSPIRALTAPER_MAX]
CHAR waveform[LIGOMETA_WAVEFORM_MAX]
CHAR numrel_data[LIGOMETA_STRING_MAX]