diff options
Diffstat (limited to 'src/fit.c')
-rw-r--r-- | src/fit.c | 221 |
1 files changed, 148 insertions, 73 deletions
@@ -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; + } } } |