aboutsummaryrefslogtreecommitdiff
path: root/src/fit.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fit.c')
-rw-r--r--src/fit.c221
1 files changed, 148 insertions, 73 deletions
diff --git a/src/fit.c b/src/fit.c
index 79d8c8e..64a2a5a 100644
--- a/src/fit.c
+++ b/src/fit.c
@@ -5775,52 +5775,51 @@ void sigint_handler(int dummy)
stop = 1;
}
-int get_event(zebraFile *f, event *ev, bank *b)
+int get_event(zebraFile *f, event *ev, zebraBank *bev)
{
/* Read all the PMT banks from the zebra file and update `ev`.
*
- * Returns the last return value from get_bank(). */
+ * Returns 0 on success, -1 on error. */
int i, rv;
PMTBank bpmt;
+ zebraBank b;
int id, crate, card, channel;
for (i = 0; i < MAX_PMTS; i++) {
ev->pmt_hits[i].hit = 0;
}
- while (1) {
- rv = next_bank(f, b);
+ rv = zebra_get_bank(f,&b,bev->links[KEV_PMT-1]);
- if (rv == -1) {
- break;
- } else if (rv == 1) {
- /* EOF */
- break;
- }
+ if (rv) {
+ fprintf(stderr, "error getting PMT bank: %s\n", zebra_err);
+ return -1;
+ }
- switch (b->name) {
- case PMT_RECORD:
- unpack_pmt(b->data, &bpmt);
- card = bpmt.pin/1024;
- crate = (bpmt.pin % 1024)/32;
- channel = bpmt.pin % 32;
- id = crate*512 + card*32 + channel;
- ev->pmt_hits[id].hit = 1;
- ev->pmt_hits[id].t = bpmt.pt;
- ev->pmt_hits[id].qhl = bpmt.phl;
- ev->pmt_hits[id].qhs = bpmt.phs;
- ev->pmt_hits[id].qlx = bpmt.plx;
- ev->pmt_hits[id].flags |= bpmt.pf & KPF_DIS;
- break;
- case EV_RECORD:
- case MAST_RECORD:
- goto end;
+ while (1) {
+ unpack_pmt(b.data, &bpmt);
+ card = bpmt.pin/1024;
+ crate = (bpmt.pin % 1024)/32;
+ channel = bpmt.pin % 32;
+ id = crate*512 + card*32 + channel;
+ ev->pmt_hits[id].hit = 1;
+ ev->pmt_hits[id].t = bpmt.pt;
+ ev->pmt_hits[id].qhl = bpmt.phl;
+ ev->pmt_hits[id].qhs = bpmt.phs;
+ ev->pmt_hits[id].qlx = bpmt.plx;
+ ev->pmt_hits[id].flags |= bpmt.pf & KPF_DIS;
+
+ if (!b.next) break;
+
+ rv = zebra_get_bank(f,&b,b.next);
+
+ if (rv) {
+ fprintf(stderr, "error getting PMT bank: %s\n", zebra_err);
+ return -1;
}
}
-end:
-
- return rv;
+ return 0;
}
size_t get_nhit(event *ev)
@@ -5890,7 +5889,7 @@ int main(int argc, char **argv)
{
int i, j, k;
zebraFile *f;
- bank b;
+ zebraBank bmast, bmc, bmcgn, mctk, b;
int rv;
EVBank bev;
MCTKBank bmctk;
@@ -6014,69 +6013,139 @@ int main(int argc, char **argv)
exit(1);
}
- int first_ev = 1;
- int first_mctk = 1;
- int first_mcvx = 1;
- int skip = 0;
while (1) {
- if (!skip)
- rv = next_bank(f, &b);
-
- skip = 0;
+ rv = zebra_read_next_logical_record(f);
if (rv == -1) {
- fprintf(stderr, "error getting bank: %s\n", zebra_err);
+ fprintf(stderr, "error getting logical record: %s\n", zebra_err);
goto err;
} else if (rv == 1) {
/* EOF */
break;
}
- switch (b.name) {
- case MAST_RECORD:
- /* New event. */
- if (fout) fprintf(fout, " -\n");
- first_ev = 1;
- first_mctk = 1;
- first_mcvx = 1;
- break;
- case MCVX_RECORD:
- /* New MC vertex. */
- unpack_mcvx(b.data, &bmcvx);
- if (fout && b.status & KMCVX_CRE) {
- if (first_mcvx) fprintf(fout, " mcvx:\n");
- fprintf(fout, " -\n");
- fprintf(fout, " posx: %.2f\n", bmcvx.x);
- fprintf(fout, " posy: %.2f\n", bmcvx.y);
- fprintf(fout, " posz: %.2f\n", bmcvx.z);
+ rv = zebra_get_bank(f, &bmast, f->first_bank);
+
+ if (rv) {
+ fprintf(stderr, "error getting MAST bank: %s\n", zebra_err);
+ goto err;
+ }
+
+ if (fout) fprintf(fout, " -\n");
+
+ if (bmast.links[KMAST_MC-1] == 0) {
+ fprintf(stderr, "MAST link is zero!\n");
+ goto err;
+ }
+
+ rv = zebra_get_bank(f,&bmc,bmast.links[KMAST_MC-1]);
+
+ if (rv) {
+ fprintf(stderr, "error getting MC bank: %s\n", zebra_err);
+ goto err;
+ }
+
+ if (bmast.links[KMC_MCGN-1] == 0) {
+ fprintf(stderr, "MCGN link is zero!\n");
+ goto err;
+ }
+
+ rv = zebra_get_bank(f,&bmcgn,bmc.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");
+ goto err;
}
- first_mcvx = 0;
- break;
- case MCTK_RECORD:
- /* New MC track. */
+
+ rv = zebra_get_bank(f,&mctk,bmcgn.links[KMCGN_MCTK-1]);
+
+ if (rv) {
+ fprintf(stderr, "error getting MCTK bank: %s\n", zebra_err);
+ goto err;
+ }
+
+ rv = zebra_get_bank(f,&b,mctk.orig);
+
+ if (rv) {
+ fprintf(stderr, "error getting MCTK bank: %s\n", zebra_err);
+ goto err;
+ }
+
unpack_mctk(b.data, &bmctk);
- if (fout && bmctk.idp != 0) {
- if (first_mctk) fprintf(fout, " mctk:\n");
+
+ if (mctk.up == 0) {
+ fprintf(stderr, "MCVX link is zero!\n");
+ goto err;
+ }
+
+ rv = zebra_get_bank(f,&b,mctk.up);
+
+ if (rv) {
+ fprintf(stderr, "error getting MCVX bank: %s\n", zebra_err);
+ goto err;
+ }
+
+ 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);
}
- first_mctk = 0;
- break;
- case EV_RECORD:
+
+ if (bmcgn.next) {
+ rv = zebra_get_bank(f,&bmcgn,bmcgn.next);
+
+ if (rv) {
+ fprintf(stderr, "error getting MCGN bank: %s\n", zebra_err);
+ goto err;
+ }
+ } else {
+ break;
+ }
+ }
+
+ rv = zebra_get_bank(f,&b,bmast.links[KMAST_EV-1]);
+
+ if (rv) {
+ fprintf(stderr, "error getting EV bank: %s\n", zebra_err);
+ goto err;
+ }
+
+ /* Skip to the last event so we can traverse them in reverse order. The
+ * reason for this is that for some reason SNOMAN puts the events in
+ * reverse order within each logical record. */
+ while (b.next) {
+ rv = zebra_get_bank(f,&b,b.next);
+
+ if (rv) {
+ fprintf(stderr, "error getting EV bank: %s\n", zebra_err);
+ goto err;
+ }
+ }
+
+ if (fout) fprintf(fout, " ev:\n");
+ while (1) {
unpack_ev(b.data, &bev);
ev.run = bev.run;
ev.gtid = bev.gtr_id;
- if (!first_ev && skip_second_event) continue;
-
rv = get_event(f,&ev,&b);
if (fout) {
- if (first_ev) fprintf(fout, " ev:\n");
fprintf(fout, " - gtid: %i\n", ev.gtid);
fprintf(fout, " nhit: %zu\n", get_nhit(&ev));
fprintf(fout, " fit:\n");
@@ -6127,11 +6196,17 @@ int main(int argc, char **argv)
}
}
- first_ev = 0;
+ /* Note the origin link for the first EV bank points back to the
+ * structural link location in the MAST bank. These links are super
+ * confusing! */
+ if ((b.orig == f->first_bank-KMAST_EV) || skip_second_event) break;
- /* Skip reading in the next bank since get_event() already read in
- * the next bank. */
- skip = 1;
+ rv = zebra_get_bank(f,&b,b.orig);
+
+ if (rv) {
+ fprintf(stderr, "error getting EV bank: %s\n", zebra_err);
+ goto err;
+ }
}
}