#include #include #include #include /* --- pawc common to hold all events */ #define LIMIT 8000000 int pawc_[LIMIT]; /* --- Output ntuple ID */ static const int idn=1000; static struct { int bof; /* 0xb0f */ int marker; /* 0xeeeeeeee */ int size; /* 8 words */ int version; int sourceID; int lvl1ID; int bcid; int triggerType; int detectorType; int status; int reserved0[3]; unsigned int mask0, mask1; int reserved1[2]; float energy[64]; } fixedBlock; static struct { int OCstatus; int statSize; int dataSize; int status_ptr; int eof; /* 0xe0f */ } trailer; main() { int tchi2[64], tindx[64], time[64], gain[64], chi2[64]; int mask, ntchi2, i, nevt = 0; /* ---------------------------------------- * Book the ntuple * ---------------------------------------- */ if (idn){ const char *fmt = "srcID,l1ID,bcid,ttype,dettype,status,rsvd0(3),mask0,mask1,rsvd1(2)"; int limit = LIMIT; hlimit_(&limit); hbnt_ (&idn, "Channels", "M", 8L, 1L); hbname_(&idn, "Head", &fixedBlock.sourceID, fmt, 4L, strlen(fmt)); hbname_(&idn, "Edsp", &fixedBlock.energy, "Ed(64)", 4L, 6L); hbname_(&idn, "Tdsp", time, "Td(64):I:16", 4L, 11L); hbname_(&idn, "Gain", gain, "gain(64):U:2", 4L, 12L); hbname_(&idn, "Chi2", chi2, "chi2(64):I:32", 4L, 13L); } loop: fread(&fixedBlock, sizeof(fixedBlock), 1, stdin); if (feof(stdin)) goto end_of_run; assert(fixedBlock.bof == 0xb0f); assert(fixedBlock.marker == 0xeeeeeeee); assert(fixedBlock.size == 8); ntchi2 = 0; /* Number of channels with time and chi2 */ mask = fixedBlock.mask0; for(i=0; i<32; i++){ if (mask & 0x80000000){ tindx[i] = ntchi2; /* Time info for channel i is at position ntchi2 */ ntchi2++; } else tindx[i] = -1; /* Time info not available for channel i */ mask <<= 1; } mask = fixedBlock.mask1; for(i=32; i<64; i++){ if (mask & 0x80000000){ tindx[i] = ntchi2; ntchi2++; } else tindx[i] = -1; mask <<= 1; } fread(&tchi2, sizeof(int), ntchi2, stdin); fread(&trailer, sizeof(trailer), 1, stdin); assert(!feof(stdin)); assert(trailer.eof == 0xe0f); /* i = 64 */ while(i--) if (tindx[i] < 0){ chi2[i] = 0; gain[i] = 0; time[i] = 9999; } else{ chi2[i] = tchi2[tindx[i]] >> 16; /* signed right shift */ gain[i] = tchi2[tindx[i]] >> 14 & 3; time[i] = tchi2[tindx[i]] << 18 >> 18; /* signed right shift */ } /* === Fill ntuple */ nevt++; hfnt_(&idn); goto loop; end_of_run: hrput_(&idn, "chn.hist", "N", 8L, 1L); fprintf(stderr, "End of run after %d events\n", nevt); }