diff options
Diffstat (limited to 'src/zdab-cat.c')
-rw-r--r-- | src/zdab-cat.c | 117 |
1 files changed, 55 insertions, 62 deletions
diff --git a/src/zdab-cat.c b/src/zdab-cat.c index 5b9bb3d..278236c 100644 --- a/src/zdab-cat.c +++ b/src/zdab-cat.c @@ -26,6 +26,15 @@ #include <errno.h> /* for errno */ #include "release.h" #include "dc.h" +#include "hdf5.h" +#include <math.h> +#include "hdf5_utils.h" + +/* Maximum number of events, primary seed particle tracks, and fits. + * + * FIXME: I should write out the events, tracks, and fits as they come up + * instead of storing them until the end. */ +#define MAX_NEVENTS 1000000 #define EV_RECORD 0x45562020 // 'EV ' #define MCTK_RECORD 0x4d43544b // 'MCTK' @@ -47,22 +56,25 @@ int main(int argc, char **argv) { int i; zebraFile *f; - zebraBank bmast, bmc, bmcgn, mctk, b; + zebraBank bmast, mc, bmcgn, mctk, b; int rv; EVBank bev; FTPVBank bftpv; FTXKBank bftxk; RSPBank bftxr; + MCBank bmc; MCTKBank bmctk; MCVXBank bmcvx; event ev = {0}; char *filename = NULL; char *output = NULL; - FILE *fout = stdout; int skip_second_event = 0; - size_t nhit; int last_run; char dqxx_file[256]; + int nevents = 0; + static HDF5Event hdf5_events[MAX_NEVENTS]; + int nmcgn = 0; + static HDF5MCGN hdf5_mcgn[MAX_NEVENTS]; for (i = 1; i < argc; i++) { if (strlen(argv[i]) >= 2 && !strncmp(argv[i], "--", 2)) { @@ -96,23 +108,8 @@ int main(int argc, char **argv) return 1; } - if (output) { - fout = fopen(output, "w"); - - if (!fout) { - fprintf(stderr, "failed to open '%s': %s\n", output, strerror(errno)); - return 1; - } - } - - if (fout) { - fprintf(fout, "git_sha1: %s\n", GitSHA1()); - fprintf(fout, "git_dirty: %s\n", GitDirty()); - } - if (load_pmt_info()) { zebra_close(f); - if (output) fclose(fout); return 1; } @@ -160,11 +157,9 @@ int main(int argc, char **argv) continue; } - if (fout) fprintf(fout, "---\n"); - if (bmast.links[KMAST_MC-1] == 0) goto skip_mc; - rv = zebra_get_bank(f,&bmc,bmast.links[KMAST_MC-1]); + rv = zebra_get_bank(f,&mc,bmast.links[KMAST_MC-1]); if (rv) { fprintf(stderr, "error getting MC bank: %s\n", zebra_err); @@ -176,14 +171,15 @@ int main(int argc, char **argv) goto err; } - rv = zebra_get_bank(f,&bmcgn,bmc.links[KMC_MCGN-1]); + unpack_mc(mc.data, &bmc); + + rv = zebra_get_bank(f,&bmcgn,mc.links[KMC_MCGN-1]); if (rv) { fprintf(stderr, "error getting MCGN bank: %s\n", zebra_err); goto err; } - if (fout) fprintf(fout, " mcgn:\n"); while (1) { if (bmcgn.links[KMCGN_MCTK-1] == 0) { fprintf(stderr, "MCTK link is zero!\n"); @@ -232,17 +228,18 @@ int main(int argc, char **argv) unpack_mcvx(b.data, &bmcvx); - if (fout) { - fprintf(fout, " -\n"); - fprintf(fout, " id: %" PRIu32 "\n", bmctk.idp); - fprintf(fout, " energy: %.2f\n", bmctk.ene); - fprintf(fout, " posx: %.2f\n", bmcvx.x); - fprintf(fout, " posy: %.2f\n", bmcvx.y); - fprintf(fout, " posz: %.2f\n", bmcvx.z); - fprintf(fout, " dirx: %.4f\n", bmctk.drx); - fprintf(fout, " diry: %.4f\n", bmctk.dry); - fprintf(fout, " dirz: %.4f\n", bmctk.drz); - fprintf(fout, " time: %.4f\n", bmcvx.tim); + if (output) { + hdf5_mcgn[nmcgn].evn = bmc.evn; + hdf5_mcgn[nmcgn].id = bmctk.idp; + hdf5_mcgn[nmcgn].energy = bmctk.ene; + hdf5_mcgn[nmcgn].x = bmcvx.x; + hdf5_mcgn[nmcgn].y = bmcvx.y; + hdf5_mcgn[nmcgn].z = bmcvx.z; + hdf5_mcgn[nmcgn].dirx = bmctk.drx; + hdf5_mcgn[nmcgn].diry = bmctk.dry; + hdf5_mcgn[nmcgn].dirz = bmctk.drz; + hdf5_mcgn[nmcgn].time = bmcvx.tim; + nmcgn++; } if (bmcgn.next) { @@ -278,7 +275,6 @@ skip_mc: } } - if (fout) fprintf(fout, " ev:\n"); while (1) { unpack_ev(b.data, &bev); ev.run = bev.run; @@ -305,44 +301,41 @@ skip_mc: rv = get_event(f,&ev,&b); - nhit = get_nhit(&ev); + if (output) { + hdf5_events[nevents].run = ev.run; + hdf5_events[nevents].evn = bmc.evn; + hdf5_events[nevents].gtr = ev.trigger_time; + hdf5_events[nevents].nhit = ev.nhit; + hdf5_events[nevents].gtid = ev.gtid; + hdf5_events[nevents].trg_type = ev.trigger_type; + hdf5_events[nevents].dc = get_dc_word(&ev, f, &bmast, &b); - if (fout) { - fprintf(fout, " - run: %i\n", ev.run); - fprintf(fout, " gtr: %.0f\n", ev.trigger_time); - fprintf(fout, " nhit: %zu\n", nhit); - fprintf(fout, " gtid: %i\n", ev.gtid); - fprintf(fout, " trg_type: 0x%08x\n", ev.trigger_type); - fprintf(fout, " dc: 0x%08x\n", get_dc_word(&ev, f, &bmast, &b)); - } - - if (fout) { if (get_ftpv(f,&b,&bftpv)) { fprintf(stderr, "%s\n", zdab_err); + hdf5_events[nevents].ftp_x = NAN; + hdf5_events[nevents].ftp_y = NAN; + hdf5_events[nevents].ftp_z = NAN; } else { - fprintf(fout, " ftp:\n"); - fprintf(fout, " x: %.2f\n", bftpv.x); - fprintf(fout, " y: %.2f\n", bftpv.y); - fprintf(fout, " z: %.2f\n", bftpv.z); + hdf5_events[nevents].ftp_x = bftpv.x; + hdf5_events[nevents].ftp_y = bftpv.y; + hdf5_events[nevents].ftp_z = bftpv.z; } - } - if (fout) { if (get_ftxk(f,&b,&bftxk)) { fprintf(stderr, "%s\n", zdab_err); + hdf5_events[nevents].ftk_energy = NAN; } else { - fprintf(fout, " ftk:\n"); - fprintf(fout, " energy: %.2f\n", bftxk.energy); + hdf5_events[nevents].ftk_energy = bftxk.energy; } - } - if (fout) { if (get_rsp(f,&b,&bftxr)) { fprintf(stderr, "%s\n", zdab_err); + hdf5_events[nevents].rsp_energy = NAN; } else { - fprintf(fout, " rsp:\n"); - fprintf(fout, " energy: %.2f\n", bftxr.ene); + hdf5_events[nevents].rsp_energy = bftxr.ene; } + + nevents++; } /* Note the origin link for the first EV bank points back to the @@ -359,9 +352,11 @@ skip_mc: } } - db_free(db); + if (output) { + save_output(output, hdf5_events, nevents, hdf5_mcgn, nmcgn, NULL, 0); + } - if (fout) fclose(fout); + db_free(db); zebra_close(f); @@ -370,8 +365,6 @@ skip_mc: err: db_free(db); - if (fout) fclose(fout); - zebra_close(f); return 1; |