From d729c65bd5af4fef680d66a8a7324d3002eadb1a Mon Sep 17 00:00:00 2001 From: Emilio <Emilio.Meschi@cern.ch> Date: Tue, 20 Nov 2018 14:29:26 +0100 Subject: [PATCH] modified formats and processor for new bx word structure --- src/format.h | 104 +++++++++++++++++++++++++++-------------------- src/processor.cc | 23 +++++------ 2 files changed, 71 insertions(+), 56 deletions(-) diff --git a/src/format.h b/src/format.h index ef70b49e..fc78adbb 100644 --- a/src/format.h +++ b/src/format.h @@ -13,73 +13,91 @@ struct block1{ uint32_t mu2s[8]; }; -// struct out_block1{ -// uint32_t header; -// uint32_t bx; -// uint32_t orbit; +struct muon{ + uint32_t f; + uint32_t s; +}; -// // In the header is information of how many of muons are there -// uint32_t mu_w1; -// uint32_t mu_w2; -// }; +struct block{ + uint32_t bx; + uint32_t orbit; + muon mu[16]; +}; struct masks{ - static constexpr uint32_t phiext = 0x1ff; - static constexpr uint32_t pt = 0x1ff; - static constexpr uint32_t qual = 0xf; - static constexpr uint32_t etaext = 0x1ff; - static constexpr uint32_t etaextv = 0xff; - static constexpr uint32_t etaexts = 0x100; - static constexpr uint32_t iso = 0x3; - static constexpr uint32_t chrg = 0x1; - static constexpr uint32_t chrgv = 0x1; - static constexpr uint32_t index = 0x7f; - static constexpr uint32_t phi = 0x3ff; - static constexpr uint32_t eta = 0x1ff; - static constexpr uint32_t etav = 0xff; - static constexpr uint32_t etas = 0x100; - static constexpr uint32_t rsv = 0x3; + //bx word: 16 bits used for actual bx, MS 4 bits are muon type + //(0xf intermediate, 0x0 final, following 4 bits for link id) + static constexpr uint32_t bx = 0xffff; + static constexpr uint32_t interm = 0x000f; + static constexpr uint32_t linkid = 0x000f; + //masks for muon 64 bits + static constexpr uint32_t phiext = 0x01ff; + static constexpr uint32_t pt = 0x01ff; + static constexpr uint32_t qual = 0x000f; + static constexpr uint32_t etaext = 0x01ff; + static constexpr uint32_t etaextv = 0x00ff; + static constexpr uint32_t etaexts = 0x0100; + static constexpr uint32_t iso = 0x0003; + static constexpr uint32_t chrg = 0x0001; + static constexpr uint32_t chrgv = 0x0001; + static constexpr uint32_t index = 0x007f; + static constexpr uint32_t phi = 0x03ff; + static constexpr uint32_t eta = 0x01ff; + static constexpr uint32_t etav = 0x00ff; + static constexpr uint32_t etas = 0x0100; + //NOTA BENE: reserved two bits are used for muon id + //0x1==intermediate, 0x2==final + static constexpr uint32_t rsv = 0x0003; }; struct shifts{ - static constexpr uint32_t phiext = 0; - static constexpr uint32_t pt = 10; - static constexpr uint32_t qual = 19; + //bx word: 16 bits used for actual bx, MS 4 bits are muon type + //(0xf intermediate, 0x0 final, following 4 bits for link id) + static constexpr uint32_t bx = 0; + static constexpr uint32_t interm = 27; + static constexpr uint32_t linkid = 23; + //shifts for muon 64 bits + static constexpr uint32_t phiext = 0; + static constexpr uint32_t pt = 10; + static constexpr uint32_t qual = 19; static constexpr uint32_t etaext = 23; - static constexpr uint32_t iso = 0; - static constexpr uint32_t chrg = 2; - static constexpr uint32_t chrgv = 3; - static constexpr uint32_t index = 4; - static constexpr uint32_t phi = 11; - static constexpr uint32_t eta = 21; - static constexpr uint32_t rsv = 30; + static constexpr uint32_t iso = 0; + static constexpr uint32_t chrg = 2; + static constexpr uint32_t chrgv = 3; + static constexpr uint32_t index = 4; + static constexpr uint32_t phi = 11; + static constexpr uint32_t eta = 21; + static constexpr uint32_t rsv = 30; }; struct header_shifts{ - static constexpr uint32_t bxmatch=24; - static constexpr uint32_t mAcount=16; - static constexpr uint32_t orbitmatch=8; - static constexpr uint32_t mBcount=0; + static constexpr uint32_t bxmatch = 24; + static constexpr uint32_t mAcount = 16; + static constexpr uint32_t orbitmatch = 8; + static constexpr uint32_t mBcount = 0; }; struct header_masks{ - static constexpr uint32_t bxmatch = 0xff<<header_shifts::bxmatch; - static constexpr uint32_t mAcount = 0xf<<header_shifts::mAcount; - static constexpr uint32_t orbitmatch = 0xff<<header_shifts::orbitmatch; - static constexpr uint32_t mBcount = 0xf; + static constexpr uint32_t bxmatch = 0xff << header_shifts::bxmatch; + static constexpr uint32_t mAcount = 0x0f << header_shifts::mAcount; + static constexpr uint32_t orbitmatch = 0xff << header_shifts::orbitmatch; + static constexpr uint32_t mBcount = 0x0f << header_shifts::mBcount; }; struct gmt_scales{ - static constexpr float pt_scale = 0.5; + static constexpr float pt_scale = 0.5; static constexpr float phi_scale = 2.*M_PI/576.; 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 deadbeef = 0xdeadbeef; + static constexpr uint32_t intermediate_marker= 0x0000000f; static constexpr uint32_t orbit_trailer_size = 32; + static constexpr uint32_t intermediate = 0x00000001; + static constexpr uint32_t final = 0x00000001; }; diff --git a/src/processor.cc b/src/processor.cc index 89a017e9..d7d2ba7a 100644 --- a/src/processor.cc +++ b/src/processor.cc @@ -43,13 +43,20 @@ Slice* StreamProcessor::process(Slice& input, Slice& out) bool BblocksOn[8]; for(unsigned int i = 0; i < 8; i++){ - uint32_t bx = bl->bx[i]; - if(bx==constants::deadbeef){ + if(bl->bx[i]==constants::deadbeef){ p += constants::orbit_trailer_size; endoforbit = true; break; } - bxmatch += (bx==bl->bx[0])<<i; + uint32_t bx = (bl->bx[i] >> shifts::bx) & masks::bx; + uint32_t interm = (bl->bx[i] >> shifts::interm) & masks::interm; + bl->mu1f[i] |= interm == constants::intermediate_marker ? + (constants::intermediate & masks::interm)<<shifts::interm : + (constants::final & masks::interm)<<shifts::interm; + bl->mu2f[i] |= interm == constants::intermediate_marker ? + (constants::intermediate & masks::interm)<<shifts::interm : + (constants::final & masks::interm)<<shifts::interm; + bxmatch += (bx==((bl->bx[0] >> shifts::bx) & masks::bx))<<i; uint32_t orbit = bl->orbit[i]; orbitmatch += (orbit==bl->orbit[0])<<i; uint32_t pt = (bl->mu1f[i] >> shifts::pt) & masks::pt; @@ -95,16 +102,6 @@ Slice* StreamProcessor::process(Slice& input, Slice& out) } - //here do the processing - // for(;;) { - // if( p==input.end() ) - // break; - // // Note: no overflow checking is needed here, as we have twice the - // // input string length, but the square of a non-negative integer n - // // cannot have more than twice as many digits as n. - // m(q,"%ld",y); - // q = strchr(q,0); - // } out.set_end(q); out.set_counts(counts); return &out; -- GitLab