aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/fit.c34
-rw-r--r--src/hdf5_utils.c18
-rw-r--r--src/hdf5_utils.h12
-rw-r--r--src/zdab-cat.c26
-rw-r--r--src/zdab_utils.c22
-rw-r--r--src/zdab_utils.h22
6 files changed, 126 insertions, 8 deletions
diff --git a/src/fit.c b/src/fit.c
index e791480..68d66af 100644
--- a/src/fit.c
+++ b/src/fit.c
@@ -5977,7 +5977,7 @@ int main(int argc, char **argv)
{
int i, j, k;
zebraFile *f;
- zebraBank bmast, mc, bmcgn, mctk, b;
+ zebraBank bmast, mc, bmcgn, mctk, b, rhdr;
int rv;
EVBank bev;
FTPVBank bftpv;
@@ -5986,6 +5986,7 @@ int main(int argc, char **argv)
MCBank bmc;
MCTKBank bmctk;
MCVXBank bmcvx;
+ RHDRBank brhdr;
event ev = {0};
char *filename = NULL;
char *output = NULL;
@@ -6021,6 +6022,12 @@ int main(int argc, char **argv)
* Note: Declared static since otherwise it will cause a stack overflow. */
static HDF5Fit hdf5_fits[MAX_NEVENTS];
+ int nrhdr = 0;
+ /* Array of run header info to write out to HDF5 file.
+ *
+ * Note: Declared static since otherwise it will cause a stack overflow. */
+ static HDF5RHDR hdf5_rhdr[MAX_NEVENTS];
+
for (i = 1; i < argc; i++) {
if (strlen(argv[i]) >= 2 && !strncmp(argv[i], "--", 2)) {
if (!strcmp(argv[i]+2,"skip-second-event")) {
@@ -6143,6 +6150,25 @@ int main(int argc, char **argv)
goto err;
}
+ if (bmast.links[KMAST_RHDR-1] != 0) {
+ rv = zebra_get_bank(f,&rhdr,bmast.links[KMAST_RHDR-1]);
+
+ if (rv) {
+ fprintf(stderr, "error getting RHDR bank: %s\n", zebra_err);
+ goto err;
+ }
+
+ unpack_rhdr(rhdr.data, &brhdr);
+
+ hdf5_rhdr[nrhdr].run = brhdr.run_number;
+ hdf5_rhdr[nrhdr].run_mask = brhdr.run_mask;
+ hdf5_rhdr[nrhdr].first_gtid = brhdr.first_gt;
+
+ nrhdr += 1;
+
+ continue;
+ }
+
if (bmast.links[KMAST_EV-1] == 0) {
/* First logical record in SNOCR files don't have an EV bank. */
continue;
@@ -6342,7 +6368,7 @@ skip_mc:
nfits++;
- if (output) save_output(output, hdf5_events, nevents, hdf5_mcgn, nmcgn, hdf5_fits, nfits);
+ if (output) save_output(output, hdf5_events, nevents, hdf5_mcgn, nmcgn, hdf5_fits, nfits, hdf5_rhdr, nrhdr);
} else {
/* Loop over 1,2,...,max_particles particle hypotheses. */
for (i = 1; i <= max_particles; i++) {
@@ -6361,7 +6387,7 @@ skip_mc:
nfits++;
- if (output) save_output(output, hdf5_events, nevents, hdf5_mcgn, nmcgn, hdf5_fits, nfits);
+ if (output) save_output(output, hdf5_events, nevents, hdf5_mcgn, nmcgn, hdf5_fits, nfits, hdf5_rhdr, nrhdr);
}
}
}
@@ -6384,7 +6410,7 @@ skip_event:
end:
- if (output) save_output(output, hdf5_events, nevents, hdf5_mcgn, nmcgn, hdf5_fits, nfits);
+ if (output) save_output(output, hdf5_events, nevents, hdf5_mcgn, nmcgn, hdf5_fits, nfits, hdf5_rhdr, nrhdr);
free_interpolation();
pmt_response_free();
diff --git a/src/hdf5_utils.c b/src/hdf5_utils.c
index 2a8f396..2da7d58 100644
--- a/src/hdf5_utils.c
+++ b/src/hdf5_utils.c
@@ -30,7 +30,7 @@ char *GitDirty(void);
* chunked and extensible to allow the cat-grid-jobs script to work.
*
*/
-int save_output(const char *output, HDF5Event *hdf5_events, size_t nevents, HDF5MCGN *hdf5_mcgn, size_t nmcgn, HDF5Fit *hdf5_fits, size_t nfits)
+int save_output(const char *output, HDF5Event *hdf5_events, size_t nevents, HDF5MCGN *hdf5_mcgn, size_t nmcgn, HDF5Fit *hdf5_fits, size_t nfits, HDF5RHDR *hdf5_rhdr, size_t nrhdr)
{
hid_t hdf5_events_tid; /* File datatype identifier */
hid_t file, dataset, space; /* Handles */
@@ -39,6 +39,9 @@ int save_output(const char *output, HDF5Event *hdf5_events, size_t nevents, HDF5
hid_t hdf5_mcgn_tid; /* File datatype identifier */
hid_t dataset_mcgn, space_mcgn; /* Handles */
hsize_t dim_mcgn[1]; /* Dataspace dimensions */
+ hid_t hdf5_rhdr_tid; /* File datatype identifier */
+ hid_t dataset_rhdr, space_rhdr; /* Handles */
+ hsize_t dim_rhdr[1]; /* Dataspace dimensions */
hid_t hdf5_fits_tid; /* File datatype identifier */
hid_t dataset_fits, space_fits; /* Handles */
hsize_t dim_fits[1]; /* Dataspace dimensions */
@@ -53,6 +56,8 @@ int save_output(const char *output, HDF5Event *hdf5_events, size_t nevents, HDF5
space = H5Screate_simple(1, dim, NULL);
dim_mcgn[0] = nmcgn;
space_mcgn = H5Screate_simple(1, dim_mcgn, NULL);
+ dim_rhdr[0] = nrhdr;
+ space_rhdr = H5Screate_simple(1, dim_rhdr, NULL);
dim_fits[0] = nfits;
space_fits = H5Screate_simple(1, dim_fits, maxdims);
chunk_dims[0] = 10;
@@ -100,6 +105,11 @@ int save_output(const char *output, HDF5Event *hdf5_events, size_t nevents, HDF5
/*
* Create the memory data type.
*/
+ hdf5_rhdr_tid = H5Tcreate(H5T_COMPOUND, sizeof(HDF5RHDR));
+ H5Tinsert(hdf5_rhdr_tid, "run", HOFFSET(HDF5RHDR, run), H5T_NATIVE_INT);
+ H5Tinsert(hdf5_rhdr_tid, "run_mask", HOFFSET(HDF5RHDR, run_mask), H5T_NATIVE_UINT32);
+ H5Tinsert(hdf5_rhdr_tid, "first_gtid", HOFFSET(HDF5RHDR, first_gtid), H5T_NATIVE_UINT32);
+
hdf5_events_tid = H5Tcreate(H5T_COMPOUND, sizeof(HDF5Event));
H5Tinsert(hdf5_events_tid, "run", HOFFSET(HDF5Event, run), H5T_NATIVE_INT);
H5Tinsert(hdf5_events_tid, "sub_run", HOFFSET(HDF5Event, sub_run), H5T_NATIVE_INT);
@@ -156,6 +166,7 @@ int save_output(const char *output, HDF5Event *hdf5_events, size_t nevents, HDF5
* Create the dataset.
*/
dataset = H5Dcreate2(file, "ev", hdf5_events_tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ dataset_rhdr = H5Dcreate2(file, "rhdr", hdf5_rhdr_tid, space_rhdr, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
dataset_mcgn = H5Dcreate2(file, "mcgn", hdf5_mcgn_tid, space_mcgn, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
dataset_fits = H5Dcreate2(file, "fits", hdf5_fits_tid, space_fits, H5P_DEFAULT, dcpl_id, H5P_DEFAULT);
@@ -166,6 +177,8 @@ int save_output(const char *output, HDF5Event *hdf5_events, size_t nevents, HDF5
status = H5Dwrite(dataset, hdf5_events_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, hdf5_events);
if (nmcgn)
status = H5Dwrite(dataset_mcgn, hdf5_mcgn_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, hdf5_mcgn);
+ if (nrhdr)
+ status = H5Dwrite(dataset_rhdr, hdf5_rhdr_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, hdf5_rhdr);
if (nfits)
status = H5Dwrite(dataset_fits, hdf5_fits_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, hdf5_fits);
@@ -180,13 +193,16 @@ int save_output(const char *output, HDF5Event *hdf5_events, size_t nevents, HDF5
H5Aclose(attr2);
H5Tclose(hdf5_events_tid);
H5Tclose(hdf5_mcgn_tid);
+ H5Tclose(hdf5_rhdr_tid);
H5Tclose(hdf5_fits_tid);
H5Sclose(space);
H5Sclose(space_mcgn);
+ H5Sclose(space_rhdr);
H5Sclose(space_fits);
H5Pclose(dcpl_id);
H5Dclose(dataset);
H5Dclose(dataset_mcgn);
+ H5Dclose(dataset_rhdr);
H5Dclose(dataset_fits);
H5Fclose(file);
diff --git a/src/hdf5_utils.h b/src/hdf5_utils.h
index 850355f..25d8757 100644
--- a/src/hdf5_utils.h
+++ b/src/hdf5_utils.h
@@ -4,6 +4,16 @@
#include <stdint.h>
#include <stdlib.h> /* for size_t */
+/* Struct to hold information for each RHDR bank.
+ *
+ * This is primarily needed to store the first_gtid variable so that later we
+ * can order the events sequentially in case of a GTID rollover. */
+typedef struct HDF5RHDR {
+ int run;
+ uint32_t run_mask;
+ uint32_t first_gtid;
+} HDF5RHDR;
+
/* Struct to hold information for each triggered event (similar to the EV bank,
* but with some reconstructed information).
*
@@ -81,6 +91,6 @@ typedef struct HDF5Fit {
double psi;
} HDF5Fit;
-int save_output(const char *output, HDF5Event *hdf5_events, size_t nevents, HDF5MCGN *hdf5_mcgn, size_t nmcgn, HDF5Fit *hdf5_fits, size_t nfits);
+int save_output(const char *output, HDF5Event *hdf5_events, size_t nevents, HDF5MCGN *hdf5_mcgn, size_t nmcgn, HDF5Fit *hdf5_fits, size_t nfits, HDF5RHDR *hdf5_rhdr, size_t nrhdr);
#endif
diff --git a/src/zdab-cat.c b/src/zdab-cat.c
index 12729d2..35fbc7d 100644
--- a/src/zdab-cat.c
+++ b/src/zdab-cat.c
@@ -58,7 +58,7 @@ int main(int argc, char **argv)
{
int i;
zebraFile *f;
- zebraBank bmast, mc, bmcgn, mctk, b;
+ zebraBank bmast, mc, bmcgn, mctk, b, rhdr;
int rv;
EVBank bev;
FTPVBank bftpv;
@@ -67,6 +67,7 @@ int main(int argc, char **argv)
MCBank bmc;
MCTKBank bmctk;
MCVXBank bmcvx;
+ RHDRBank brhdr;
event ev = {0};
char *filename = NULL;
char *output = NULL;
@@ -77,6 +78,8 @@ int main(int argc, char **argv)
static HDF5Event hdf5_events[MAX_NEVENTS];
int nmcgn = 0;
static HDF5MCGN hdf5_mcgn[MAX_NEVENTS];
+ int nrhdr = 0;
+ static HDF5RHDR hdf5_rhdr[MAX_NEVENTS];
int verbose = 0;
int32_t gtid = -1;
@@ -167,6 +170,25 @@ int main(int argc, char **argv)
goto err;
}
+ if (bmast.links[KMAST_RHDR-1] != 0) {
+ rv = zebra_get_bank(f,&rhdr,bmast.links[KMAST_RHDR-1]);
+
+ if (rv) {
+ fprintf(stderr, "error getting RHDR bank: %s\n", zebra_err);
+ goto err;
+ }
+
+ unpack_rhdr(rhdr.data, &brhdr);
+
+ hdf5_rhdr[nrhdr].run = brhdr.run_number;
+ hdf5_rhdr[nrhdr].run_mask = brhdr.run_mask;
+ hdf5_rhdr[nrhdr].first_gtid = brhdr.first_gt;
+
+ nrhdr += 1;
+
+ continue;
+ }
+
if (bmast.links[KMAST_EV-1] == 0) {
/* First logical record in SNOCR files doesn't have an EV bank. */
continue;
@@ -369,7 +391,7 @@ skip_event:
}
if (output) {
- save_output(output, hdf5_events, nevents, hdf5_mcgn, nmcgn, NULL, 0);
+ save_output(output, hdf5_events, nevents, hdf5_mcgn, nmcgn, NULL, 0, hdf5_rhdr, nrhdr);
}
db_free(db);
diff --git a/src/zdab_utils.c b/src/zdab_utils.c
index 8b6cbc8..911850e 100644
--- a/src/zdab_utils.c
+++ b/src/zdab_utils.c
@@ -582,6 +582,28 @@ err:
return -1;
}
+void unpack_rhdr(uint32_t *data, RHDRBank *b)
+{
+ unpack((uint8_t *) data, "l", &b->date);
+ unpack((uint8_t *) (data+1), "l", &b->time);
+ unpack((uint8_t *) (data+2), "l", &b->DAQ_Version);
+ unpack((uint8_t *) (data+3), "l", &b->run_number);
+ unpack((uint8_t *) (data+4), "l", &b->cal_trial);
+ unpack((uint8_t *) (data+5), "l", &b->source_mask);
+ unpack((uint8_t *) (data+6), "l", &b->run_mask);
+ unpack((uint8_t *) (data+7), "l", &b->gt_crate_mask);
+ unpack((uint8_t *) (data+8), "l", &b->first_gt);
+ unpack((uint8_t *) (data+9), "l", &b->valid_gt);
+ unpack((uint8_t *) (data+10), "l", &b->spare1);
+ unpack((uint8_t *) (data+11), "l", &b->spare2);
+ unpack((uint8_t *) (data+12), "l", &b->spare3);
+ unpack((uint8_t *) (data+13), "l", &b->spare4);
+ unpack((uint8_t *) (data+14), "l", &b->spare5);
+ unpack((uint8_t *) (data+15), "l", &b->spare6);
+ unpack((uint8_t *) (data+16), "l", &b->spare7);
+ unpack((uint8_t *) (data+17), "l", &b->spare8);
+}
+
void unpack_rsp(uint32_t *data, RSPBank *b)
{
unpack((uint8_t *) data, "f", &b->optical_response);
diff --git a/src/zdab_utils.h b/src/zdab_utils.h
index 91f8898..ca47cbb 100644
--- a/src/zdab_utils.h
+++ b/src/zdab_utils.h
@@ -208,6 +208,27 @@ extern char zdab_err[256];
/* Structural links for FTXV bank. */
#define KFTXV_FTXT 1 /* Link to first fit track. */
+typedef struct RHDRBank {
+ uint32_t date; /* Format: yyyymmdd. */
+ uint32_t time; /* Format: hhmmsscc - cc is centisec. */
+ uint32_t DAQ_Version; /* DAQ Version. */
+ uint32_t run_number; /* Run number. */
+ uint32_t cal_trial; /* Calibration trial number. */
+ uint32_t source_mask; /* Source mask indicates which source is present. */
+ uint32_t run_mask; /* Run type, see: http://hep.uchicago.edu/~tlatorre/snoman_companion/id_run_types.html. */
+ uint32_t gt_crate_mask; /* Mask which shows which crates are masked in. */
+ uint32_t first_gt; /* First GTID of this run. */
+ uint32_t valid_gt; /* First valid GTID (after hardware changes have been made). */
+ uint32_t spare1;
+ uint32_t spare2;
+ uint32_t spare3;
+ uint32_t spare4;
+ uint32_t spare5;
+ uint32_t spare6;
+ uint32_t spare7;
+ uint32_t spare8;
+} RHDRBank;
+
typedef struct RSPBank {
/* Optical response for this event. */
float optical_response;
@@ -664,6 +685,7 @@ int get_ftpv(zebraFile *f, zebraBank *ev, FTPVBank *bftpv);
int get_ftxk(zebraFile *f, zebraBank *ev, FTXKBank *bftxk);
int get_rsp(zebraFile *f, zebraBank *ev, RSPBank *brsp);
+void unpack_rhdr(uint32_t *data, RHDRBank *b);
void unpack_rsp(uint32_t *data, RSPBank *b);
void unpack_ftpt(uint32_t *data, FTPTBank *b);
void unpack_ftpv(uint32_t *data, FTPVBank *b);