aboutsummaryrefslogtreecommitdiff
path: root/src/zdab-cat.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/zdab-cat.c')
-rw-r--r--src/zdab-cat.c117
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;