Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-10-25 09:45:38

0001 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0002 #include "EventFilter/L1TRawToDigi/plugins/UnpackerFactory.h"
0003 
0004 #include "L1Trigger/L1TCalorimeter/interface/CaloTools.h"
0005 
0006 #include "L1TObjectCollections.h"
0007 
0008 // #include "L1TStage2Layer2Constants.h"

0009 #include "ZDCUnpacker.h"
0010 #include "GTSetup.h"
0011 
0012 namespace l1t {
0013   namespace stage2 {
0014     ZDCUnpacker::ZDCUnpacker() : EtSumZDCCopy_(0) {}
0015 
0016     bool ZDCUnpacker::unpack(const Block& block, UnpackerCollections* coll) {
0017       using namespace l1t::stage2;
0018       uint32_t zdc_mask = 0x3FF;
0019       LogDebug("L1T") << "Block ID  = " << block.header().getID() << " size = " << block.header().getSize();
0020 
0021       int nBX = int(ceil(block.header().getSize() / zdc::nOutputFramePerBX));
0022       // expect the first four frames to be the first 4 EtSum objects reported per event (see CMS IN-2013/005)

0023 
0024       // Find the central, first and last BXs

0025       int firstBX = (nBX / 2) - nBX + 1;
0026       int lastBX = nBX / 2;
0027 
0028       auto res_ = static_cast<L1TObjectCollections*>(coll)->getZDCSums(EtSumZDCCopy_);
0029       res_->setBXRange(firstBX, lastBX);
0030 
0031       LogDebug("L1T") << "nBX = " << nBX << " first BX = " << firstBX << " lastBX = " << lastBX;
0032 
0033       // Loop over multiple BX and fill EtSums collection

0034       for (int bx = firstBX; bx <= lastBX; bx++) {
0035         // ZDC -

0036         int iFrame = (bx - firstBX) * zdc::nOutputFramePerBX;
0037 
0038         uint32_t raw_data = block.payload().at(iFrame + 1);  // ZDC - info is found on frame 1 of each bx

0039 
0040         l1t::EtSum zdcm{l1t::EtSum::kZDCM};
0041         zdcm.setHwPt(raw_data & zdc_mask);
0042         zdcm.setP4(l1t::CaloTools::p4Demux(&zdcm));
0043 
0044         LogDebug("L1T") << "ZDC -: pT " << zdcm.hwPt() << " bx " << bx;
0045 
0046         res_->push_back(bx, zdcm);
0047 
0048         // ZDC +

0049         raw_data = block.payload().at(iFrame + 2);  // ZDC + info is found on frame 2 of each bx

0050 
0051         l1t::EtSum zdcp{l1t::EtSum::kZDCP};
0052         zdcp.setHwPt(raw_data & zdc_mask);
0053         zdcp.setP4(l1t::CaloTools::p4Demux(&zdcp));
0054 
0055         LogDebug("L1T") << "ZDC +: pT " << zdcp.hwPt() << " bx " << bx;
0056 
0057         res_->push_back(bx, zdcp);
0058       }
0059 
0060       return true;
0061     }
0062   }  // namespace stage2

0063 }  // namespace l1t

0064 
0065 DEFINE_L1T_UNPACKER(l1t::stage2::ZDCUnpacker);