diff options
author | tlatorre <tlatorre@uchicago.edu> | 2019-09-30 11:10:20 -0500 |
---|---|---|
committer | tlatorre <tlatorre@uchicago.edu> | 2019-09-30 11:10:20 -0500 |
commit | 76006218bdb36fc1f11a33678b83ec0776cc6228 (patch) | |
tree | 2c87cfd51bcd4dfdde6d82b77abf6a8a57ed9cfc | |
parent | e41bc169e213bbb2fb1c132150736e3ad8760dd4 (diff) | |
download | sddm-76006218bdb36fc1f11a33678b83ec0776cc6228.tar.gz sddm-76006218bdb36fc1f11a33678b83ec0776cc6228.tar.bz2 sddm-76006218bdb36fc1f11a33678b83ec0776cc6228.zip |
write out run header info to the hdf5 file
-rw-r--r-- | src/fit.c | 34 | ||||
-rw-r--r-- | src/hdf5_utils.c | 18 | ||||
-rw-r--r-- | src/hdf5_utils.h | 12 | ||||
-rw-r--r-- | src/zdab-cat.c | 26 | ||||
-rw-r--r-- | src/zdab_utils.c | 22 | ||||
-rw-r--r-- | src/zdab_utils.h | 22 |
6 files changed, 126 insertions, 8 deletions
@@ -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); |