diff --git a/src/format.h b/src/format.h index 80974c2fc8698a08a830c0881ebcbf3d2699704e..b7b53a31df3325a6ff8bd503690b900ce46b2b5e 100644 --- a/src/format.h +++ b/src/format.h @@ -66,4 +66,11 @@ struct gmt_scales{ static constexpr float eta_scale = 0.0870/8; //9th MS bit is sign static constexpr float phi_range = M_PI; }; + +struct constants{ + static constexpr uint32_t deadbeef = 0xdeadbeef; + static constexpr uint32_t orbit_trailer_size = 32; +}; + + #endif diff --git a/src/processor.cc b/src/processor.cc index ab5c67b36d8abbe90ed45834c07537e67d47fbbe..5d48af77a99c9df0faa8f2e456fdff4d928dff3b 100644 --- a/src/processor.cc +++ b/src/processor.cc @@ -13,69 +13,56 @@ StreamProcessor::~StreamProcessor(){ } void* StreamProcessor::operator()( void* item ){ + int bsize = sizeof(block1); Slice& input = *static_cast<Slice*>(item); - - if(input.size()<max_size){ - // fprintf(stderr,"transform operator gets slice of %d size\n",input.size()); - - + Slice& out = *Slice::allocate( 2*max_size); + if((input.size()-constants::orbit_trailer_size)%bsize!=0){ + std::cout << "WARNING::frame size not a multiple of block size. Will be skipped. Size=" + << input.size() << " - block size=" << bsize << std::endl; + return &out; } - // (unsigned long long)input.end()); char* p = input.begin(); - Slice& out = *Slice::allocate( 2*max_size); char* q = out.begin(); uint32_t counts = 0; - int bsize = sizeof(block1); + while(p!=input.end()){ - + bool endoforbit = false; block1 *bl = (block1*)p; int mAcount = 0; int mBcount = 0; - uint32_t bxmatch=0; uint32_t orbitmatch=0; + bool AblocksOn[8]; bool BblocksOn[8]; + for(unsigned int i = 0; i < 8; i++){ uint32_t bx = bl->bx[i]; + if(bx==constants::deadbeef){ + p += constants::orbit_trailer_size; + endoforbit = true; + break; + } bxmatch += (bx==bl->bx[0])<<i; uint32_t orbit = bl->orbit[i]; orbitmatch += (orbit==bl->orbit[0])<<i; - - // uint32_t phiext = (bl->mu1f[i] >> shifts::phiext) & masks::phiext; uint32_t pt = (bl->mu1f[i] >> shifts::pt) & masks::pt; - // uint32_t qual = (bl->mu1f[i] >> shifts::qual) & masks::qual; - // uint32_t etaext = (bl->mu1f[i] >> shifts::etaext) & masks::etaext; - // uint32_t iso = (bl->mu1s[i] >> shifts::iso) & masks::iso; - // uint32_t chrg = (bl->mu1s[i] >> shifts::chrg) & masks::chrg; - // uint32_t chrgv = (bl->mu1s[i] >> shifts::chrgv) & masks::chrgv; - // uint32_t index = (bl->mu1s[i] >> shifts::index) & masks::index; - // uint32_t phi = (bl->mu1s[i] >> shifts::phi) & masks::phi; - // uint32_t eta = (bl->mu1s[i] >> shifts::eta) & masks::eta; - // uint32_t rsv = (bl->mu1s[i] >> shifts::rsv) & masks::rsv; AblocksOn[i]=(pt>0); if(pt>0){ mAcount++; } - // phiext = (bl->mu2f[i] >> shifts::phiext) & masks::phiext; pt = (bl->mu2f[i] >> shifts::pt) & masks::pt; - // qual = (bl->mu2f[i] >> shifts::qual) & masks::qual; - // etaext = (bl->mu2f[i] >> shifts::etaext) & masks::etaext; - // iso = (bl->mu2s[i] >> shifts::iso) & masks::iso; - // chrg = (bl->mu2s[i] >> shifts::chrg) & masks::chrg; - // chrgv = (bl->mu2s[i] >> shifts::chrgv) & masks::chrgv; - // index = (bl->mu2s[i] >> shifts::index) & masks::index; - // phi = (bl->mu2s[i] >> shifts::phi) & masks::phi; - // eta = (bl->mu2s[i] >> shifts::eta) & masks::eta; - // rsv = (bl->mu2s[i] >> shifts::rsv) & masks::rsv; BblocksOn[i]=(pt>0); - if(pt>0)mBcount++; + if(pt>0){ + mBcount++; + } } - + if(endoforbit) continue; uint32_t bxcount = std::max(mAcount,mBcount); if(bxcount == 0) { - p+=sizeof(block1); + p+=bsize; + std::cout << "WARNING::detected a bx with zero muons, this should not happen" << std::endl; continue; }