29#include <lal/LALMalloc.h>
30#include <lal/LALVCSInfo.h>
31#include <lal/LIGOLwXML.h>
32#include <lal/LIGOLwXMLRead.h>
33#include <lal/LIGOMetadataTables.h>
34#include <lal/LIGOMetadataUtils.h>
35#include <lal/XLALError.h>
55 memset(new->comment, 0,
sizeof(new->comment));
62 memset(new->ifos, 0,
sizeof(new->ifos));
129 int (*comparfunc)(
const void *,
const void *)
141 for(thisSearchSumm = *summHead; thisSearchSumm; thisSearchSumm = thisSearchSumm->
next)
148 for(i = 0, thisSearchSumm = *summHead; i < numSumms; ++i, thisSearchSumm = thisSearchSumm->
next)
149 summHandle[i] = thisSearchSumm;
152 qsort(summHandle, numSumms,
sizeof(summHandle[0]), comparfunc);
155 thisSearchSumm = *summHead = summHandle[0];
156 for(i = 1; i < numSumms; ++i, thisSearchSumm = thisSearchSumm->
next)
157 thisSearchSumm->
next = summHandle[i];
158 thisSearchSumm->
next = NULL;
183 for(; input; input = input->
next) {
184 if(strcmp(input->
ifos, ifos))
197 memcpy(*next, input,
sizeof(**next));
198 next = &(*next)->
next;
215 static const char table_name[] =
"search_summary";
219 struct MetaioParseEnvironment env;
223 int lalwrapper_cvs_tag;
228 int in_start_time_ns;
232 int out_start_time_ns;
241 if(MetaioOpenFile(&env,
filename)) {
242 XLALPrintError(
"%s(): error opening \"%s\": %s\n", __func__,
filename, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
245 if(MetaioOpenTableOnly(&env, table_name)) {
247 XLALPrintError(
"%s(): cannot find %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
256 column_pos.lalwrapper_cvs_tag =
XLALLIGOLwFindColumn(&env,
"lalwrapper_cvs_tag", METAIO_TYPE_LSTRING, 1);
261 column_pos.in_start_time_ns =
XLALLIGOLwFindColumn(&env,
"in_start_time_ns", METAIO_TYPE_INT_4S, 1);
263 column_pos.in_end_time_ns =
XLALLIGOLwFindColumn(&env,
"in_end_time_ns", METAIO_TYPE_INT_4S, 1);
264 column_pos.out_start_time =
XLALLIGOLwFindColumn(&env,
"out_start_time", METAIO_TYPE_INT_4S, 1);
265 column_pos.out_start_time_ns =
XLALLIGOLwFindColumn(&env,
"out_start_time_ns", METAIO_TYPE_INT_4S, 1);
267 column_pos.out_end_time_ns =
XLALLIGOLwFindColumn(&env,
"out_end_time_ns", METAIO_TYPE_INT_4S, 1);
275 XLALPrintError(
"%s(): failure reading %s table\n", __func__, table_name);
281 while((miostatus = MetaioGetRow(&env)) > 0) {
295 next = &(*next)->
next;
299 row->
process_id = env.ligo_lw.table.elt[column_pos.process_id].data.int_8s;
305 strncpy(row->
comment, env.ligo_lw.table.elt[column_pos.comment].data.lstring.data,
sizeof(row->
comment) - 1);
306 strncpy(row->
ifos, env.ligo_lw.table.elt[column_pos.ifos].data.lstring.data,
sizeof(row->
ifos) - 1);
307 XLALGPSSet(&row->
in_start_time, env.ligo_lw.table.elt[column_pos.in_start_time].data.int_4s, env.ligo_lw.table.elt[column_pos.in_start_time_ns].data.int_4s);
308 XLALGPSSet(&row->
in_end_time, env.ligo_lw.table.elt[column_pos.in_end_time].data.int_4s, env.ligo_lw.table.elt[column_pos.in_end_time_ns].data.int_4s);
309 XLALGPSSet(&row->
out_start_time, env.ligo_lw.table.elt[column_pos.out_start_time].data.int_4s, env.ligo_lw.table.elt[column_pos.out_start_time_ns].data.int_4s);
310 XLALGPSSet(&row->
out_end_time, env.ligo_lw.table.elt[column_pos.out_end_time].data.int_4s, env.ligo_lw.table.elt[column_pos.out_end_time_ns].data.int_4s);
311 row->
nevents = env.ligo_lw.table.elt[column_pos.nevents].data.int_4s;
312 row->
nnodes = env.ligo_lw.table.elt[column_pos.nnodes].data.int_4s;
317 XLALPrintError(
"%s(): I/O error parsing %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
323 if(MetaioClose(&env)) {
325 XLALPrintError(
"%s(): error parsing document after %s table: %s\n", __func__, table_name, env.mierrmsg.data ? env.mierrmsg.data :
"unknown reason");
345 const char *row_head =
"\n\t\t\t";
350 XLALFilePuts(
"\t<Table Name=\"search_summary:table\">\n", xml->
fp);
351 XLALFilePuts(
"\t\t<Column Name=\"process:process_id\" Type=\"int_8s\"/>\n", xml->
fp);
352 XLALFilePuts(
"\t\t<Column Name=\"shared_object\" Type=\"lstring\"/>\n", xml->
fp);
353 XLALFilePuts(
"\t\t<Column Name=\"lalwrapper_cvs_tag\" Type=\"lstring\"/>\n", xml->
fp);
354 XLALFilePuts(
"\t\t<Column Name=\"lal_cvs_tag\" Type=\"lstring\"/>\n", xml->
fp);
355 XLALFilePuts(
"\t\t<Column Name=\"comment\" Type=\"lstring\"/>\n", xml->
fp);
356 XLALFilePuts(
"\t\t<Column Name=\"ifos\" Type=\"lstring\"/>\n", xml->
fp);
357 XLALFilePuts(
"\t\t<Column Name=\"in_start_time\" Type=\"int_4s\"/>\n", xml->
fp);
358 XLALFilePuts(
"\t\t<Column Name=\"in_start_time_ns\" Type=\"int_4s\"/>\n", xml->
fp);
359 XLALFilePuts(
"\t\t<Column Name=\"in_end_time\" Type=\"int_4s\"/>\n", xml->
fp);
360 XLALFilePuts(
"\t\t<Column Name=\"in_end_time_ns\" Type=\"int_4s\"/>\n", xml->
fp);
361 XLALFilePuts(
"\t\t<Column Name=\"out_start_time\" Type=\"int_4s\"/>\n", xml->
fp);
362 XLALFilePuts(
"\t\t<Column Name=\"out_start_time_ns\" Type=\"int_4s\"/>\n", xml->
fp);
363 XLALFilePuts(
"\t\t<Column Name=\"out_end_time\" Type=\"int_4s\"/>\n", xml->
fp);
364 XLALFilePuts(
"\t\t<Column Name=\"out_end_time_ns\" Type=\"int_4s\"/>\n", xml->
fp);
365 XLALFilePuts(
"\t\t<Column Name=\"nevents\" Type=\"int_4s\"/>\n", xml->
fp);
366 XLALFilePuts(
"\t\t<Column Name=\"nnodes\" Type=\"int_4s\"/>\n", xml->
fp);
367 XLALFilePuts(
"\t\t<Stream Name=\"search_summary:table\" Type=\"Local\" Delimiter=\",\">", xml->
fp);
373 for(; search_summary; search_summary = search_summary->
next) {
374 if(
XLALFilePrintf(xml->
fp,
"%s%ld,\"standalone\",\"\",\"%s\",\"%s\",\"%s\",%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", row_head, search_summary->
process_id,
lalVCSInfo.
vcsTag, search_summary->
comment, search_summary->
ifos, search_summary->
in_start_time.
gpsSeconds, search_summary->
in_start_time.
gpsNanoSeconds, search_summary->
in_end_time.
gpsSeconds, search_summary->
in_end_time.
gpsNanoSeconds, search_summary->
out_start_time.
gpsSeconds, search_summary->
out_start_time.
gpsNanoSeconds, search_summary->
out_end_time.
gpsSeconds, search_summary->
out_end_time.
gpsNanoSeconds, search_summary->
nevents, search_summary->
nnodes) < 0)
376 row_head =
",\n\t\t\t";
const LALVCSInfo lalVCSInfo
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)
INT8 XLALGPSToINT8NS(const LIGOTimeGPS *epoch)
SearchSummaryTable * XLALDestroySearchSummaryTableRow(SearchSummaryTable *row)
Destroy a SearchSummaryTable structure.
int XLALWriteLIGOLwXMLSearchSummaryTable(LIGOLwXMLStream *xml, const SearchSummaryTable *search_summary)
Write a search_summary table to an XML file.
void XLALDestroySearchSummaryTable(SearchSummaryTable *head)
Destroy a SearchSummaryTable linked list.
SearchSummaryTable * XLALIfoScanSearchSummary(SearchSummaryTable *input, CHAR *ifos)
Scan through a linked list of search_summary row objects and copy rows whose ifos match the given str...
int XLALCompareSearchSummaryByOutTime(const void *a, const void *b)
int XLALTimeSortSearchSummary(SearchSummaryTable **summHead, int(*comparfunc)(const void *, const void *))
SearchSummaryTable * XLALSearchSummaryTableFromLIGOLw(const char *filename)
Read the search_summary table from a LIGO Light Weight XML file into a linked list of SearchSummaryTa...
SearchSummaryTable * XLALCreateSearchSummaryTableRow(const ProcessTable *process)
Create a SearchSummaryTable structure.
This structure contains the file stream and current table type for writing to LIGO lightweight XML fi...
CHAR comment[LIGOMETA_COMMENT_MAX]
LIGOTimeGPS out_start_time
struct tagSearchSummaryTable * next
CHAR ifos[LIGOMETA_IFOS_MAX]
LIGOTimeGPS in_start_time
void output(int gps_sec, int output_type)