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 new->process_id =
new->event_id = -1;
49 memset(new->ifo, 0,
sizeof(new->ifo));
50 memset(new->search, 0,
sizeof(new->search));
51 memset(new->channel, 0,
sizeof(new->channel));
96 static const char table_name[] =
"sngl_burst";
100 struct MetaioParseEnvironment env;
123 if(MetaioOpenFile(&env,
filename)) {
124 XLALPrintError(
"%s(): error opening \"%s\": %s\n", __func__,
filename, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
127 if(MetaioOpenTableOnly(&env, table_name)) {
129 XLALPrintError(
"%s(): cannot find %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
158 XLALPrintError(
"%s(): failure reading %s table: missing required column\n", __func__, table_name);
164 while((miostatus = MetaioGetRow(&env)) > 0) {
178 next = &(*next)->
next;
182 row->
process_id = env.ligo_lw.table.elt[column_pos.process_id].data.int_8s;
183 if(strlen(env.ligo_lw.table.elt[column_pos.ifo].data.lstring.data) >=
sizeof(row->
ifo) ||
184 strlen(env.ligo_lw.table.elt[column_pos.search].data.lstring.data) >=
sizeof(row->
search) ||
185 strlen(env.ligo_lw.table.elt[column_pos.channel].data.lstring.data) >=
sizeof(row->
channel)) {
188 XLALPrintError(
"%s(): failure reading %s table: string too long\n", __func__, table_name);
191 strncpy(row->
ifo, env.ligo_lw.table.elt[column_pos.ifo].data.lstring.data,
sizeof(row->
ifo) - 1);
192 strncpy(row->
search, env.ligo_lw.table.elt[column_pos.search].data.lstring.data,
sizeof(row->
search) - 1);
193 strncpy(row->
channel, env.ligo_lw.table.elt[column_pos.channel].data.lstring.data,
sizeof(row->
channel) - 1);
194 XLALGPSSet(&row->
start_time, env.ligo_lw.table.elt[column_pos.start_time].data.int_4s, env.ligo_lw.table.elt[column_pos.start_time_ns].data.int_4s);
195 XLALGPSSet(&row->
peak_time, env.ligo_lw.table.elt[column_pos.peak_time].data.int_4s, env.ligo_lw.table.elt[column_pos.peak_time_ns].data.int_4s);
196 row->
duration = env.ligo_lw.table.elt[column_pos.duration].data.real_4;
197 row->
central_freq = env.ligo_lw.table.elt[column_pos.central_freq].data.real_4;
198 row->
bandwidth = env.ligo_lw.table.elt[column_pos.bandwidth].data.real_4;
199 row->
amplitude = env.ligo_lw.table.elt[column_pos.amplitude].data.real_4;
200 row->
snr = env.ligo_lw.table.elt[column_pos.snr].data.real_4;
201 row->
confidence = env.ligo_lw.table.elt[column_pos.confidence].data.real_4;
202 row->
chisq = env.ligo_lw.table.elt[column_pos.chisq].data.real_8;
203 row->
chisq_dof = env.ligo_lw.table.elt[column_pos.chisq_dof].data.real_8;
204 row->
event_id = env.ligo_lw.table.elt[column_pos.event_id].data.int_8s;
209 XLALPrintError(
"%s(): I/O error parsing %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
215 if(MetaioClose(&env)) {
217 XLALPrintError(
"%s(): error parsing document after %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
235 const char *row_head =
"\n\t\t\t";
241 XLALFilePuts(
"\t\t<Column Name=\"process:process_id\" Type=\"int_8s\"/>\n", xml->
fp);
242 XLALFilePuts(
"\t\t<Column Name=\"ifo\" Type=\"lstring\"/>\n", xml->
fp);
243 XLALFilePuts(
"\t\t<Column Name=\"search\" Type=\"lstring\"/>\n", xml->
fp);
244 XLALFilePuts(
"\t\t<Column Name=\"channel\" Type=\"lstring\"/>\n", xml->
fp);
245 XLALFilePuts(
"\t\t<Column Name=\"start_time\" Type=\"int_4s\"/>\n", xml->
fp);
246 XLALFilePuts(
"\t\t<Column Name=\"start_time_ns\" Type=\"int_4s\"/>\n", xml->
fp);
247 XLALFilePuts(
"\t\t<Column Name=\"peak_time\" Type=\"int_4s\"/>\n", xml->
fp);
248 XLALFilePuts(
"\t\t<Column Name=\"peak_time_ns\" Type=\"int_4s\"/>\n", xml->
fp);
249 XLALFilePuts(
"\t\t<Column Name=\"duration\" Type=\"real_4\"/>\n", xml->
fp);
250 XLALFilePuts(
"\t\t<Column Name=\"central_freq\" Type=\"real_4\"/>\n", xml->
fp);
251 XLALFilePuts(
"\t\t<Column Name=\"bandwidth\" Type=\"real_4\"/>\n", xml->
fp);
252 XLALFilePuts(
"\t\t<Column Name=\"amplitude\" Type=\"real_4\"/>\n", xml->
fp);
253 XLALFilePuts(
"\t\t<Column Name=\"snr\" Type=\"real_4\"/>\n", xml->
fp);
254 XLALFilePuts(
"\t\t<Column Name=\"confidence\" Type=\"real_4\"/>\n", xml->
fp);
255 XLALFilePuts(
"\t\t<Column Name=\"chisq\" Type=\"real_8\"/>\n", xml->
fp);
256 XLALFilePuts(
"\t\t<Column Name=\"chisq_dof\" Type=\"real_8\"/>\n", xml->
fp);
257 XLALFilePuts(
"\t\t<Column Name=\"event_id\" Type=\"int_8s\"/>\n", xml->
fp);
258 XLALFilePuts(
"\t\t<Stream Name=\"sngl_burst:table\" Type=\"Local\" Delimiter=\",\">", xml->
fp);
264 for(; sngl_burst; sngl_burst = sngl_burst->
next) {
265 if(
XLALFilePrintf(xml->
fp,
"%s%ld,\"%s\",\"%s\",\"%s\",%d,%d,%d,%d,%.8g,%.8g,%.8g,%.8g,%.8g,%.8g,%.16g,%.16g,%ld",
286 row_head =
",\n\t\t\t";
313 for(; head; head = head->
next) {
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)
#define XLAL_REAL4_FAIL_NAN
#define XLAL_REAL8_FAIL_NAN
int XLALPrintError(const char *fmt,...) _LAL_GCC_PRINTF_FORMAT_(1
LIGOTimeGPS * XLALGPSSet(LIGOTimeGPS *epoch, INT4 gpssec, INT8 gpsnan)
SnglBurst * XLALDestroySnglBurst(SnglBurst *row)
Free a SnglBurst.
int XLALWriteLIGOLwXMLSnglBurstTable(LIGOLwXMLStream *xml, const SnglBurst *sngl_burst)
Write a sngl_burst table to an XML file.
SnglBurst * XLALSnglBurstTableFromLIGOLw(const char *filename)
Read the sngl_burst table from a LIGO Light Weight XML file into a linked list of SnglBurst structure...
SnglBurst * XLALCreateSnglBurst(void)
Create a SnglBurst structure.
void XLALDestroySnglBurstTable(SnglBurst *head)
Free a SnglBurst linked list.
long XLALSnglBurstAssignIDs(SnglBurst *head, long process_id, long event_id)
Assign event_id values to the entries in a SnglBurst linked list.
This structure contains the file stream and current table type for writing to LIGO lightweight XML fi...
CHAR channel[LIGOMETA_CHANNEL_MAX]
CHAR search[LIGOMETA_SEARCH_MAX]
CHAR ifo[LIGOMETA_IFO_MAX]
struct tagSnglBurst * next