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>
48 memset(new->ifo, 0,
sizeof(new->ifo));
49 memset(new->search, 0,
sizeof(new->search));
50 memset(new->channel, 0,
sizeof(new->channel));
90 static const char table_name[] =
"sngl_inspiral";
94 struct MetaioParseEnvironment env;
105 int template_duration;
140 int rsqveto_duration;
164 if(MetaioOpenFile(&env,
filename)) {
165 XLALPrintError(
"%s(): error opening \"%s\": %s\n", __func__,
filename, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
168 if(MetaioOpenTableOnly(&env, table_name)) {
170 XLALPrintError(
"%s(): cannot find %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
185 column_pos.impulse_time_ns =
XLALLIGOLwFindColumn(&env,
"impulse_time_ns", METAIO_TYPE_INT_4S, 1);
186 column_pos.template_duration =
XLALLIGOLwFindColumn(&env,
"template_duration", METAIO_TYPE_REAL_8, 1);
187 column_pos.event_duration =
XLALLIGOLwFindColumn(&env,
"event_duration", METAIO_TYPE_REAL_8, 1);
217 column_pos.bank_chisq_dof =
XLALLIGOLwFindColumn(&env,
"bank_chisq_dof", METAIO_TYPE_INT_4S, 1);
219 column_pos.cont_chisq_dof =
XLALLIGOLwFindColumn(&env,
"cont_chisq_dof", METAIO_TYPE_INT_4S, 1);
221 column_pos.rsqveto_duration =
XLALLIGOLwFindColumn(&env,
"rsqveto_duration", METAIO_TYPE_REAL_4, 1);
246 XLALPrintError(
"%s(): failure reading %s table\n", __func__, table_name);
252 while((miostatus = MetaioGetRow(&env)) > 0) {
266 next = &(*next)->
next;
270 row->
process_id = env.ligo_lw.table.elt[column_pos.process_id].data.int_8s;
271 strncpy(row->
ifo, env.ligo_lw.table.elt[column_pos.ifo].data.lstring.data,
sizeof(row->
ifo) - 1);
272 strncpy(row->
search, env.ligo_lw.table.elt[column_pos.search].data.lstring.data,
sizeof(row->
search) - 1);
273 strncpy(row->
channel, env.ligo_lw.table.elt[column_pos.channel].data.lstring.data,
sizeof(row->
channel) - 1);
274 XLALGPSSet(&row->
end, env.ligo_lw.table.elt[column_pos.end_time].data.int_4s, env.ligo_lw.table.elt[column_pos.end_time_ns].data.int_4s);
275 row->
end_time_gmst = env.ligo_lw.table.elt[column_pos.end_time_gmst].data.real_8;
276 XLALGPSSet(&row->
impulse_time, env.ligo_lw.table.elt[column_pos.impulse_time].data.int_4s, env.ligo_lw.table.elt[column_pos.impulse_time_ns].data.int_4s);
277 row->
template_duration = env.ligo_lw.table.elt[column_pos.template_duration].data.real_8;
278 row->
event_duration = env.ligo_lw.table.elt[column_pos.event_duration].data.real_8;
279 row->
amplitude = env.ligo_lw.table.elt[column_pos.amplitude].data.real_4;
280 row->
eff_distance = env.ligo_lw.table.elt[column_pos.eff_distance].data.real_4;
281 row->
coa_phase = env.ligo_lw.table.elt[column_pos.coa_phase].data.real_4;
282 row->
mass1 = env.ligo_lw.table.elt[column_pos.mass1].data.real_4;
283 row->
mass2 = env.ligo_lw.table.elt[column_pos.mass2].data.real_4;
284 row->
mchirp = env.ligo_lw.table.elt[column_pos.mchirp].data.real_4;
285 row->
mtotal = env.ligo_lw.table.elt[column_pos.mtotal].data.real_4;
286 row->
eta = env.ligo_lw.table.elt[column_pos.eta].data.real_4;
287 row->
tau0 = env.ligo_lw.table.elt[column_pos.tau0].data.real_4;
288 row->
tau2 = env.ligo_lw.table.elt[column_pos.tau2].data.real_4;
289 row->
tau3 = env.ligo_lw.table.elt[column_pos.tau3].data.real_4;
290 row->
tau4 = env.ligo_lw.table.elt[column_pos.tau4].data.real_4;
291 row->
tau5 = env.ligo_lw.table.elt[column_pos.tau5].data.real_4;
292 row->
ttotal = env.ligo_lw.table.elt[column_pos.ttotal].data.real_4;
293 row->
psi0 = env.ligo_lw.table.elt[column_pos.psi0].data.real_4;
294 row->
psi3 = env.ligo_lw.table.elt[column_pos.psi3].data.real_4;
295 row->
alpha = env.ligo_lw.table.elt[column_pos.alpha].data.real_4;
296 row->
alpha1 = env.ligo_lw.table.elt[column_pos.alpha1].data.real_4;
297 row->
alpha2 = env.ligo_lw.table.elt[column_pos.alpha2].data.real_4;
298 row->
alpha3 = env.ligo_lw.table.elt[column_pos.alpha3].data.real_4;
299 row->
alpha4 = env.ligo_lw.table.elt[column_pos.alpha4].data.real_4;
300 row->
alpha5 = env.ligo_lw.table.elt[column_pos.alpha5].data.real_4;
301 row->
alpha6 = env.ligo_lw.table.elt[column_pos.alpha6].data.real_4;
302 row->
beta = env.ligo_lw.table.elt[column_pos.beta].data.real_4;
303 row->
f_final = env.ligo_lw.table.elt[column_pos.f_final].data.real_4;
304 row->
snr = env.ligo_lw.table.elt[column_pos.snr].data.real_4;
305 row->
chisq = env.ligo_lw.table.elt[column_pos.chisq].data.real_4;
306 row->
chisq_dof = env.ligo_lw.table.elt[column_pos.chisq_dof].data.int_4s;
307 row->
bank_chisq = env.ligo_lw.table.elt[column_pos.bank_chisq].data.real_4;
308 row->
bank_chisq_dof = env.ligo_lw.table.elt[column_pos.bank_chisq_dof].data.int_4s;
309 row->
cont_chisq = env.ligo_lw.table.elt[column_pos.cont_chisq].data.real_4;
310 row->
cont_chisq_dof = env.ligo_lw.table.elt[column_pos.cont_chisq_dof].data.int_4s;
311 row->
sigmasq = env.ligo_lw.table.elt[column_pos.sigmasq].data.real_8;
312 row->
rsqveto_duration = env.ligo_lw.table.elt[column_pos.rsqveto_duration].data.real_4;
313 row->
Gamma[0] = env.ligo_lw.table.elt[column_pos.Gamma0].data.real_4;
314 row->
Gamma[1] = env.ligo_lw.table.elt[column_pos.Gamma1].data.real_4;
315 row->
Gamma[2] = env.ligo_lw.table.elt[column_pos.Gamma2].data.real_4;
316 row->
Gamma[3] = env.ligo_lw.table.elt[column_pos.Gamma3].data.real_4;
317 row->
Gamma[4] = env.ligo_lw.table.elt[column_pos.Gamma4].data.real_4;
318 row->
Gamma[5] = env.ligo_lw.table.elt[column_pos.Gamma5].data.real_4;
319 row->
Gamma[6] = env.ligo_lw.table.elt[column_pos.Gamma6].data.real_4;
320 row->
Gamma[7] = env.ligo_lw.table.elt[column_pos.Gamma7].data.real_4;
321 row->
Gamma[8] = env.ligo_lw.table.elt[column_pos.Gamma8].data.real_4;
322 row->
Gamma[9] = env.ligo_lw.table.elt[column_pos.Gamma9].data.real_4;
323 row->
kappa = env.ligo_lw.table.elt[column_pos.kappa].data.real_4;
324 row->
chi = env.ligo_lw.table.elt[column_pos.chi].data.real_4;
325 row->
spin1x = env.ligo_lw.table.elt[column_pos.spin1x].data.real_4;
326 row->
spin1y = env.ligo_lw.table.elt[column_pos.spin1y].data.real_4;
327 row->
spin1z = env.ligo_lw.table.elt[column_pos.spin1z].data.real_4;
328 row->
spin2x = env.ligo_lw.table.elt[column_pos.spin2x].data.real_4;
329 row->
spin2y = env.ligo_lw.table.elt[column_pos.spin2y].data.real_4;
330 row->
spin2z = env.ligo_lw.table.elt[column_pos.spin2z].data.real_4;
331 row->
event_id = env.ligo_lw.table.elt[column_pos.event_id].data.int_8s;
336 XLALPrintError(
"%s(): I/O error parsing %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
342 if(MetaioClose(&env)) {
344 XLALPrintError(
"%s(): error parsing document after %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
363 const char *row_head =
"\n\t\t\t";
368 XLALFilePuts(
"\t<Table Name=\"sngl_inspiral:table\">\n", xml->
fp);
369 XLALFilePuts(
"\t\t<Column Name=\"process:process_id\" Type=\"int_8s\"/>\n", xml->
fp);
370 XLALFilePuts(
"\t\t<Column Name=\"ifo\" Type=\"lstring\"/>\n", xml->
fp);
371 XLALFilePuts(
"\t\t<Column Name=\"search\" Type=\"lstring\"/>\n", xml->
fp);
372 XLALFilePuts(
"\t\t<Column Name=\"channel\" Type=\"lstring\"/>\n", xml->
fp);
373 XLALFilePuts(
"\t\t<Column Name=\"end_time\" Type=\"int_4s\"/>\n", xml->
fp);
374 XLALFilePuts(
"\t\t<Column Name=\"end_time_ns\" Type=\"int_4s\"/>\n", xml->
fp);
375 XLALFilePuts(
"\t\t<Column Name=\"end_time_gmst\" Type=\"real_8\"/>\n", xml->
fp);
376 XLALFilePuts(
"\t\t<Column Name=\"impulse_time\" Type=\"int_4s\"/>\n", xml->
fp);
377 XLALFilePuts(
"\t\t<Column Name=\"impulse_time_ns\" Type=\"int_4s\"/>\n", xml->
fp);
378 XLALFilePuts(
"\t\t<Column Name=\"template_duration\" Type=\"real_8\"/>\n", xml->
fp);
379 XLALFilePuts(
"\t\t<Column Name=\"event_duration\" Type=\"real_8\"/>\n", xml->
fp);
380 XLALFilePuts(
"\t\t<Column Name=\"amplitude\" Type=\"real_4\"/>\n", xml->
fp);
381 XLALFilePuts(
"\t\t<Column Name=\"eff_distance\" Type=\"real_4\"/>\n", xml->
fp);
382 XLALFilePuts(
"\t\t<Column Name=\"coa_phase\" Type=\"real_4\"/>\n", xml->
fp);
383 XLALFilePuts(
"\t\t<Column Name=\"mass1\" Type=\"real_4\"/>\n", xml->
fp);
384 XLALFilePuts(
"\t\t<Column Name=\"mass2\" Type=\"real_4\"/>\n", xml->
fp);
385 XLALFilePuts(
"\t\t<Column Name=\"mchirp\" Type=\"real_4\"/>\n", xml->
fp);
386 XLALFilePuts(
"\t\t<Column Name=\"mtotal\" Type=\"real_4\"/>\n", xml->
fp);
387 XLALFilePuts(
"\t\t<Column Name=\"eta\" Type=\"real_4\"/>\n", xml->
fp);
388 XLALFilePuts(
"\t\t<Column Name=\"kappa\" Type=\"real_4\"/>\n", xml->
fp);
389 XLALFilePuts(
"\t\t<Column Name=\"chi\" Type=\"real_4\"/>\n", xml->
fp);
390 XLALFilePuts(
"\t\t<Column Name=\"tau0\" Type=\"real_4\"/>\n", xml->
fp);
391 XLALFilePuts(
"\t\t<Column Name=\"tau2\" Type=\"real_4\"/>\n", xml->
fp);
392 XLALFilePuts(
"\t\t<Column Name=\"tau3\" Type=\"real_4\"/>\n", xml->
fp);
393 XLALFilePuts(
"\t\t<Column Name=\"tau4\" Type=\"real_4\"/>\n", xml->
fp);
394 XLALFilePuts(
"\t\t<Column Name=\"tau5\" Type=\"real_4\"/>\n", xml->
fp);
395 XLALFilePuts(
"\t\t<Column Name=\"ttotal\" Type=\"real_4\"/>\n", xml->
fp);
396 XLALFilePuts(
"\t\t<Column Name=\"psi0\" Type=\"real_4\"/>\n", xml->
fp);
397 XLALFilePuts(
"\t\t<Column Name=\"psi3\" Type=\"real_4\"/>\n", xml->
fp);
398 XLALFilePuts(
"\t\t<Column Name=\"alpha\" Type=\"real_4\"/>\n", xml->
fp);
399 XLALFilePuts(
"\t\t<Column Name=\"alpha1\" Type=\"real_4\"/>\n", xml->
fp);
400 XLALFilePuts(
"\t\t<Column Name=\"alpha2\" Type=\"real_4\"/>\n", xml->
fp);
401 XLALFilePuts(
"\t\t<Column Name=\"alpha3\" Type=\"real_4\"/>\n", xml->
fp);
402 XLALFilePuts(
"\t\t<Column Name=\"alpha4\" Type=\"real_4\"/>\n", xml->
fp);
403 XLALFilePuts(
"\t\t<Column Name=\"alpha5\" Type=\"real_4\"/>\n", xml->
fp);
404 XLALFilePuts(
"\t\t<Column Name=\"alpha6\" Type=\"real_4\"/>\n", xml->
fp);
405 XLALFilePuts(
"\t\t<Column Name=\"beta\" Type=\"real_4\"/>\n", xml->
fp);
406 XLALFilePuts(
"\t\t<Column Name=\"f_final\" Type=\"real_4\"/>\n", xml->
fp);
407 XLALFilePuts(
"\t\t<Column Name=\"snr\" Type=\"real_4\"/>\n", xml->
fp);
408 XLALFilePuts(
"\t\t<Column Name=\"chisq\" Type=\"real_4\"/>\n", xml->
fp);
409 XLALFilePuts(
"\t\t<Column Name=\"chisq_dof\" Type=\"int_4s\"/>\n", xml->
fp);
410 XLALFilePuts(
"\t\t<Column Name=\"bank_chisq\" Type=\"real_4\"/>\n", xml->
fp);
411 XLALFilePuts(
"\t\t<Column Name=\"bank_chisq_dof\" Type=\"int_4s\"/>\n", xml->
fp);
412 XLALFilePuts(
"\t\t<Column Name=\"cont_chisq\" Type=\"real_4\"/>\n", xml->
fp);
413 XLALFilePuts(
"\t\t<Column Name=\"cont_chisq_dof\" Type=\"int_4s\"/>\n", xml->
fp);
414 XLALFilePuts(
"\t\t<Column Name=\"sigmasq\" Type=\"real_8\"/>\n", xml->
fp);
415 XLALFilePuts(
"\t\t<Column Name=\"rsqveto_duration\" Type=\"real_4\"/>\n", xml->
fp);
416 XLALFilePuts(
"\t\t<Column Name=\"Gamma0\" Type=\"real_4\"/>\n", xml->
fp);
417 XLALFilePuts(
"\t\t<Column Name=\"Gamma1\" Type=\"real_4\"/>\n", xml->
fp);
418 XLALFilePuts(
"\t\t<Column Name=\"Gamma2\" Type=\"real_4\"/>\n", xml->
fp);
419 XLALFilePuts(
"\t\t<Column Name=\"Gamma3\" Type=\"real_4\"/>\n", xml->
fp);
420 XLALFilePuts(
"\t\t<Column Name=\"Gamma4\" Type=\"real_4\"/>\n", xml->
fp);
421 XLALFilePuts(
"\t\t<Column Name=\"Gamma5\" Type=\"real_4\"/>\n", xml->
fp);
422 XLALFilePuts(
"\t\t<Column Name=\"Gamma6\" Type=\"real_4\"/>\n", xml->
fp);
423 XLALFilePuts(
"\t\t<Column Name=\"Gamma7\" Type=\"real_4\"/>\n", xml->
fp);
424 XLALFilePuts(
"\t\t<Column Name=\"Gamma8\" Type=\"real_4\"/>\n", xml->
fp);
425 XLALFilePuts(
"\t\t<Column Name=\"Gamma9\" Type=\"real_4\"/>\n", xml->
fp);
426 XLALFilePuts(
"\t\t<Column Name=\"spin1x\" Type=\"real_4\"/>\n", xml->
fp);
427 XLALFilePuts(
"\t\t<Column Name=\"spin1y\" Type=\"real_4\"/>\n", xml->
fp);
428 XLALFilePuts(
"\t\t<Column Name=\"spin1z\" Type=\"real_4\"/>\n", xml->
fp);
429 XLALFilePuts(
"\t\t<Column Name=\"spin2x\" Type=\"real_4\"/>\n", xml->
fp);
430 XLALFilePuts(
"\t\t<Column Name=\"spin2y\" Type=\"real_4\"/>\n", xml->
fp);
431 XLALFilePuts(
"\t\t<Column Name=\"spin2z\" Type=\"real_4\"/>\n", xml->
fp);
432 XLALFilePuts(
"\t\t<Column Name=\"event_id\" Type=\"int_8s\"/>\n", xml->
fp);
433 XLALFilePuts(
"\t\t<Stream Name=\"sngl_inspiral:table\" Type=\"Local\" Delimiter=\",\">", xml->
fp);
439 for(; sngl_inspiral; sngl_inspiral = sngl_inspiral->
next) {
440 if(
XLALFilePrintf(xml->
fp,
"%s%ld,\"%s\",\"%s\",\"%s\",%d,%d,%.16g,%d,%d,%.16g,%.16g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%u,%.8g,%u,%.8g,%u,%.16g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%ld",
456 sngl_inspiral->
mass1,
457 sngl_inspiral->
mass2,
461 sngl_inspiral->
kappa,
471 sngl_inspiral->
alpha,
481 sngl_inspiral->
chisq,
489 sngl_inspiral->
Gamma[0],
490 sngl_inspiral->
Gamma[1],
491 sngl_inspiral->
Gamma[2],
492 sngl_inspiral->
Gamma[3],
493 sngl_inspiral->
Gamma[4],
494 sngl_inspiral->
Gamma[5],
495 sngl_inspiral->
Gamma[6],
496 sngl_inspiral->
Gamma[7],
497 sngl_inspiral->
Gamma[8],
498 sngl_inspiral->
Gamma[9],
507 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)
SnglInspiralTable * XLALDestroySnglInspiralTableRow(SnglInspiralTable *row)
Destroy a SnglInspiralTable structure.
SnglInspiralTable * XLALCreateSnglInspiralTableRow(const ProcessTable *process)
Create a SnglInspiralTable structure.
int XLALWriteLIGOLwXMLSnglInspiralTable(LIGOLwXMLStream *xml, const SnglInspiralTable *sngl_inspiral)
Write a linked list of SnglInspiralTable structures to a the sngl_inspiral table in a LIGO Light Weig...
void XLALDestroySnglInspiralTable(SnglInspiralTable *head)
Destroy a SnglInspiralTable linked list.
SnglInspiralTable * XLALSnglInspiralTableFromLIGOLw(const char *filename)
Read the sngl_inspiral table from a LIGO Light Weight XML file into a linked list of SnglInspiralTabl...
This structure contains the file stream and current table type for writing to LIGO lightweight XML fi...
CHAR ifo[LIGOMETA_IFO_MAX]
struct tagSnglInspiralTable * next
CHAR channel[LIGOMETA_CHANNEL_MAX]
CHAR search[LIGOMETA_SEARCH_MAX]