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