/* $id$ */ #include "gsII.h" #include #include #define NPRINTOUT 100 static int IsomerIDs[NGE]; /*------------------------------------------------------------------------*/ void setIsomerIDs(int i) { IsomerIDs[i] = 1; } /*------------------------------------------------------------------------*/ int create_isomerdata(struct EVHDR * hdr, struct EVENT * ev, unsigned int ext[]) { /* declarations */ int i, j, i0, niso; static int nn = 0, np = 0; unsigned short int w1; if (np < NPRINTOUT) { printf("create_isomerdata called, hdr->len_bgo=%i\n", hdr->len_bgo); np++; }; /* if there are no clean BGO, we have nothing to do */ if (hdr->len_bgo == 0) return (0); i0 = hdr->len_clean + hdr->len_dirty; /* find # of isomer modules */ niso = 0; for (i = i0; i < hdr->len; i++) if (IsomerIDs[ev[i].id]) niso++; if (np < NPRINTOUT) printf("niso=%i\n", niso); /* return if there are none */ if (niso == 0) return (0); /*-----------------------------------*/ /* if we get here we have work to do */ /*-----------------------------------*/ /* sanity: check that external vector is empty */ if (ext[0] > 0) { printf("found %i isomer events, but\n", niso); printf("error/create_isomerdata: ext[0]!=0, but=%i\n", ext[0]); fflush(stdout); exit(1); }; if (np < NPRINTOUT) { printf("create_isomerdata active\n"); printf("niso=%i\n", niso); printf("before mod:\n"); printf("hdr->len_clean: %i, ", hdr->len_clean); printf("hdr->len_dirty: %i, ", hdr->len_dirty); printf("hdr->len_bgo: %i\n", hdr->len_bgo); for (i = i0; i < hdr->len; i++) { printf("mod: %3i; ", ev[i].id); printf("e: %4i; ", ev[i].ebgo); printf("t: %4i\n", ev[i].tbgo); }; }; ext[0] = 3 * niso; nn = 1; for (i = i0; i < hdr->len; i++) if (IsomerIDs[ev[i].id]) { /* put information in external data vector */ ext[nn++] = (ev[i].bgohit << 9) | ev[i].id; ext[nn++] = ev[i].tbgo; ext[nn++] = ev[i].ebgo; /* remove this BGO module from the event */ /* it now only exist in the external vector */ for (j = i; j < hdr->len; j++) { ev[j].id = ev[j + 1].id; ev[j].gebit = ev[j + 1].gebit; ev[j].bgohit = ev[j + 1].bgohit; ev[j].ehi = ev[j + 1].ehi; ev[j].pu = ev[j + 1].pu; ev[j].over = ev[j + 1].over; ev[j].tge = ev[j + 1].tge; ev[j].tc = ev[j + 1].tc; ev[j].elo = ev[j + 1].elo; ev[j].eside = ev[j + 1].eside; ev[j].tbgo = ev[j + 1].tbgo; ev[j].ebgo = ev[j + 1].ebgo; ev[j].hs = ev[j + 1].hs; }; hdr->len--; hdr->len_bgo--; i--; }; if (np < NPRINTOUT) { printf("after mod:\n"); printf("hdr->len_clean: %i, ", hdr->len_clean); printf("hdr->len_dirty: %i, ", hdr->len_dirty); printf("hdr->len_bgo: %i\n", hdr->len_bgo); for (i = i0; i < hdr->len; i++) { printf("mod: %3i; ", ev[i].id); printf("e: %4i; ", ev[i].ebgo); printf("t: %4i\n", ev[i].tbgo); }; }; /* sanety check, there better not be any */ /* isomer modules left */ niso = 0; for (i = i0; i < hdr->len; i++) if (IsomerIDs[ev[i].id]) niso++; if(niso>0) { printf("error, niso=%i\n",niso); exit(1); }; /* done */ if (np < NPRINTOUT) printf("create_isomerdata stop\n"); return(0); }