Skip to content

Commit

Permalink
Merge pull request #44394 from Mmiglio/140X_caloTcpUnpacker
Browse files Browse the repository at this point in the history
 [14_0_X] Update unpacker for L1T Calo scouting + DataFormat tests
  • Loading branch information
cmsbuild committed Apr 2, 2024
2 parents 5ae3c30 + 26de14a commit c1f48bd
Show file tree
Hide file tree
Showing 11 changed files with 257 additions and 73 deletions.
2 changes: 1 addition & 1 deletion DataFormats/L1Scouting/interface/OrbitCollection.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class OrbitCollection {
}

// get number of objects stored in a BX
int getBxSize(unsigned bx) const {
unsigned getBxSize(unsigned bx) const {
if (bx >= orbitBufferSize_) {
cms::Exception("OrbitCollection") << "Called getBxSize() of a bx out of the orbit range."
<< " BX = " << bx;
Expand Down
2 changes: 1 addition & 1 deletion DataFormats/L1Scouting/test/read_L1Scouting_cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,4 @@
)

process.path = cms.Path(process.l1ScoutingTestAnalyzer)
process.endPath = cms.EndPath(process.out)
process.endPath = cms.EndPath(process.out)
4 changes: 3 additions & 1 deletion DataFormats/L1ScoutingRawData/interface/SDSNumbering.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ class SDSNumbering {
static constexpr int GtSDSID = 4;
static constexpr int BmtfMinSDSID = 10;
static constexpr int BmtfMaxSDSID = 21;
static constexpr int CaloTCPMinSDSID = 22;
static constexpr int CaloTCPMaxSDSID = 29;
};

#endif // L1ScoutingRawData_SDSNumbering_h
#endif // L1ScoutingRawData_SDSNumbering_h
24 changes: 22 additions & 2 deletions EventFilter/L1ScoutingRawToDigi/interface/blocks.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ namespace l1ScoutingRun3 {

namespace demux {

// unrolled frame block
struct block {
// unrolled DMA block
struct dmaBlock {
uint32_t header;
uint32_t bx;
uint32_t orbit;
Expand All @@ -44,7 +44,27 @@ namespace l1ScoutingRun3 {
uint32_t link7;
uint32_t tau1[6];
};

struct caloObjTcpBlock {
uint32_t header;
uint32_t bx;
uint32_t orbit;
uint32_t obj[12];
};

struct caloSumTcpBlock {
uint32_t bx;
uint32_t orbit;
uint32_t sum[6];
};

} // namespace demux

namespace bmtf {
struct block {
uint64_t stub[8];
};
} // namespace bmtf

} // namespace l1ScoutingRun3
#endif // L1ScoutingRawToDigi_blocks_h
213 changes: 163 additions & 50 deletions EventFilter/L1ScoutingRawToDigi/plugins/ScCALORawToDigi.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
ScCaloRawToDigi::ScCaloRawToDigi(const edm::ParameterSet& iConfig) {
using namespace edm;
using namespace l1ScoutingRun3;
srcInputTag = iConfig.getParameter<InputTag>("srcInputTag");
enableAllSums_ = iConfig.getUntrackedParameter<bool>("enableAllSums", false);
srcInputTag_ = iConfig.getParameter<InputTag>("srcInputTag");
enableAllSums_ = iConfig.getParameter<bool>("enableAllSums");
debug_ = iConfig.getUntrackedParameter<bool>("debug", false);
dataSourceConfig_ = iConfig.getParameter<edm::ParameterSet>("dataSource");
rawToken_ = consumes<SDSRawDataCollection>(srcInputTag_);

orbitBufferJets_ = std::vector<std::vector<Jet>>(3565);
orbitBufferEGammas_ = std::vector<std::vector<EGamma>>(3565);
Expand All @@ -17,12 +19,10 @@ ScCaloRawToDigi::ScCaloRawToDigi(const edm::ParameterSet& iConfig) {
nTausOrbit_ = 0;
nEtSumsOrbit_ = 0;

produces<JetOrbitCollection>().setBranchAlias("JetOrbitCollection");
produces<TauOrbitCollection>().setBranchAlias("TauOrbitCollection");
produces<EGammaOrbitCollection>().setBranchAlias("EGammaOrbitCollection");
produces<BxSumsOrbitCollection>().setBranchAlias("BxSumsOrbitCollection");

rawToken = consumes<SDSRawDataCollection>(srcInputTag);
produces<JetOrbitCollection>("Jet").setBranchAlias("JetOrbitCollection");
produces<TauOrbitCollection>("Tau").setBranchAlias("TauOrbitCollection");
produces<EGammaOrbitCollection>("EGamma").setBranchAlias("EGammaOrbitCollection");
produces<BxSumsOrbitCollection>("EtSum").setBranchAlias("BxSumsOrbitCollection");
}

ScCaloRawToDigi::~ScCaloRawToDigi(){};
Expand All @@ -32,22 +32,46 @@ void ScCaloRawToDigi::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
using namespace l1ScoutingRun3;

Handle<SDSRawDataCollection> ScoutingRawDataCollection;
iEvent.getByToken(rawToken, ScoutingRawDataCollection);

const FEDRawData& sourceRawData = ScoutingRawDataCollection->FEDData(SDSNumbering::CaloSDSID);
size_t orbitSize = sourceRawData.size();
iEvent.getByToken(rawToken_, ScoutingRawDataCollection);

std::unique_ptr<JetOrbitCollection> unpackedJets(new JetOrbitCollection);
std::unique_ptr<TauOrbitCollection> unpackedTaus(new TauOrbitCollection);
std::unique_ptr<EGammaOrbitCollection> unpackedEGammas(new EGammaOrbitCollection);
std::unique_ptr<BxSumsOrbitCollection> unpackedEtSums(new BxSumsOrbitCollection);

if ((sourceRawData.size() == 0) && debug_) {
std::cout << "No raw data for CALO source\n";
}
// reset counters
nJetsOrbit_ = 0;
nEGammasOrbit_ = 0;
nTausOrbit_ = 0;
nEtSumsOrbit_ = 0;

std::string dataSourceMode = dataSourceConfig_.getParameter<std::string>("dataSourceMode");
if (dataSourceMode == "DMA") {
// Packet from DMA contains all the objects
int sourceId = dataSourceConfig_.getParameter<int>("dmaSourceId");
if (sourceId != SDSNumbering::CaloSDSID)
edm::LogWarning("ScCaloRawToDIgi::produce") << "Provided an unexpected source ID: " << sourceId << "/"
<< SDSNumbering::CaloSDSID << " [provided/expected]";
unpackOrbitFromDMA(ScoutingRawDataCollection, sourceId);
} else if (dataSourceMode == "TCP") {
// unpack jets
jetSourceIdList_ = dataSourceConfig_.getParameter<std::vector<int>>("jetSourceIdList");
unpackTcpData(ScoutingRawDataCollection, jetSourceIdList_, CaloObjectType::Jet);

// unpack e/gamma
eGammaSourceIdList_ = dataSourceConfig_.getParameter<std::vector<int>>("eGammaSourceIdList");
unpackTcpData(ScoutingRawDataCollection, eGammaSourceIdList_, CaloObjectType::EGamma);

// unpack taus
tauSourceIdList_ = dataSourceConfig_.getParameter<std::vector<int>>("tauSourceIdList");
unpackTcpData(ScoutingRawDataCollection, tauSourceIdList_, CaloObjectType::Tau);

// unpack current orbit and store data into the orbitBufferr
unpackOrbit(sourceRawData.data(), orbitSize);
// unpack et sums
etSumSourceIdList_ = dataSourceConfig_.getParameter<std::vector<int>>("etSumSourceIdList");
unpackTcpData(ScoutingRawDataCollection, etSumSourceIdList_, CaloObjectType::EtSum);
} else {
throw cms::Exception("ScCaloRawToDIgi::produce") << "Unknown data source mode. Use DMA or TCP(default).";
}

// fill orbit collection and clear the Bx buffer vector
unpackedJets->fillAndClear(orbitBufferJets_, nJetsOrbit_);
Expand All @@ -56,28 +80,31 @@ void ScCaloRawToDigi::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
unpackedEtSums->fillAndClear(orbitBufferEtSums_, nEtSumsOrbit_);

// store collections in the event
iEvent.put(std::move(unpackedJets));
iEvent.put(std::move(unpackedTaus));
iEvent.put(std::move(unpackedEGammas));
iEvent.put(std::move(unpackedEtSums));
iEvent.put(std::move(unpackedJets), "Jet");
iEvent.put(std::move(unpackedTaus), "Tau");
iEvent.put(std::move(unpackedEGammas), "EGamma");
iEvent.put(std::move(unpackedEtSums), "EtSum");
}

void ScCaloRawToDigi::unpackOrbit(const unsigned char* buf, size_t len) {
void ScCaloRawToDigi::unpackOrbitFromDMA(edm::Handle<SDSRawDataCollection>& ScoutingRawDataCollection, int sourceId) {
using namespace l1ScoutingRun3;

// reset counters
nJetsOrbit_ = 0;
nEGammasOrbit_ = 0;
nTausOrbit_ = 0;
nEtSumsOrbit_ = 0;
const FEDRawData& sourceRawData = ScoutingRawDataCollection->FEDData(sourceId);
if ((sourceRawData.size() == 0) && debug_) {
std::cout << "No raw data for CALO DMA source ID=" << sourceId << std::endl;
}

// get orbit size and raw data
size_t len = sourceRawData.size();
const unsigned char* buf = sourceRawData.data();

size_t pos = 0;

while (pos < len) {
assert(pos + sizeof(demux::block) <= len);
assert(pos + sizeof(demux::dmaBlock) <= len);

demux::block* bl = (demux::block*)(buf + pos);
pos += sizeof(demux::block);
demux::dmaBlock* bl = (demux::dmaBlock*)(buf + pos);
pos += sizeof(demux::dmaBlock);

assert(pos <= len);
uint32_t orbit = bl->orbit & 0x7FFFFFFF;
Expand All @@ -90,32 +117,32 @@ void ScCaloRawToDigi::unpackOrbit(const unsigned char* buf, size_t len) {
// unpack jets from first link
if (debug_)
std::cout << "--- Jets link 1 ---\n";
unpackLinkJets(bl->jet1, bx);
unpackJets(bl->jet1, bx, 6);

// unpack jets from second link
if (debug_)
std::cout << "--- Jets link 2 ---\n";
unpackLinkJets(bl->jet2, bx);
unpackJets(bl->jet2, bx, 6);

// unpack eg from first link
if (debug_)
std::cout << "--- E/g link 1 ---\n";
unpackLinkEGammas(bl->egamma1, bx);
unpackEGammas(bl->egamma1, bx, 6);

// unpack eg from second link link
if (debug_)
std::cout << "--- E/g link 2 ---\n";
unpackLinkEGammas(bl->egamma2, bx);
unpackEGammas(bl->egamma2, bx, 6);

// unpack taus from first link
if (debug_)
std::cout << "--- Taus link 1 ---\n";
unpackLinkTaus(bl->tau1, bx);
unpackTaus(bl->tau1, bx, 6);

// unpack taus from second link
if (debug_)
std::cout << "--- Taus link 2 ---\n";
unpackLinkTaus(bl->tau2, bx);
unpackTaus(bl->tau2, bx, 6);

// unpack et sums
if (debug_)
Expand All @@ -125,11 +152,85 @@ void ScCaloRawToDigi::unpackOrbit(const unsigned char* buf, size_t len) {
} // end of bx objects
}

void ScCaloRawToDigi::unpackLinkJets(uint32_t* dataBlock, int bx) {
void ScCaloRawToDigi::unpackTcpData(edm::Handle<SDSRawDataCollection>& ScoutingRawDataCollection,
std::vector<int> sourceList,
CaloObjectType dataType) {
using namespace l1ScoutingRun3;
for (const int& sourceId : sourceList) {
if ((sourceId < SDSNumbering::CaloTCPMinSDSID) || (sourceId > SDSNumbering::CaloTCPMaxSDSID)) {
edm::LogWarning("ScCaloRawToDIgi::unpackTCPData")
<< "Source ID outside the expected range " << sourceId << "/[" << SDSNumbering::CaloTCPMinSDSID << "-"
<< SDSNumbering::CaloTCPMaxSDSID << "]"
<< " [provided/expected range]";
}
const FEDRawData& sourceRawData = ScoutingRawDataCollection->FEDData(sourceId);
size_t orbitSize = sourceRawData.size();

if ((sourceRawData.size() == 0) && debug_) {
//std::cout << "No raw data for calo " << CaloObjTypeTxt[dataType] << ", TCP source ID=" << sourceId << std::endl;
std::cout << "No raw data for calo TCP source ID=" << sourceId << std::endl;
}

unpackOrbitFromTCP(sourceRawData.data(), orbitSize, dataType);
}
}

void ScCaloRawToDigi::unpackOrbitFromTCP(const unsigned char* buf, size_t len, CaloObjectType dataType) {
using namespace l1ScoutingRun3;
size_t pos = 0;

while (pos < len) {
// frame header is present
assert(pos + 4 <= len);

// unpack calo sums block
if (dataType == CaloObjectType::EtSum) {
demux::caloSumTcpBlock* bl = (demux::caloSumTcpBlock*)(buf + pos);
pos += sizeof(demux::caloSumTcpBlock);
assert(pos <= len);
if (debug_)
std::cout << "Sums BX -> " << bl->bx << std::endl;
unpackEtSums(bl->sum, bl->bx);
} else {
// unpack jet/eg/tau
demux::caloObjTcpBlock* bl = (demux::caloObjTcpBlock*)(buf + pos);
int nObj = (bl->header) & 0xff;
pos += 12 + nObj * 4;

switch (dataType) {
case CaloObjectType::Jet:
if (debug_)
std::cout << "Jets BX -> " << bl->bx << std::endl;
unpackJets(bl->obj, bl->bx, nObj);
break;

case CaloObjectType::EGamma:
if (debug_)
std::cout << "E/Gammas BX -> " << bl->bx << std::endl;
unpackEGammas(bl->obj, bl->bx, nObj);
break;

case CaloObjectType::Tau:
if (debug_)
std::cout << "Taus BX -> " << bl->bx << std::endl;
unpackTaus(bl->obj, bl->bx, nObj);
break;

default:
throw cms::Exception("ScCaloRawToDigi::unpackOrbitFromTCP") << "Unknown data type.";
break;
}

} // unpack sums and calo objects

} // end of bx objects
}

void ScCaloRawToDigi::unpackJets(uint32_t* dataBlock, int bx, int nObjets) {
using namespace l1ScoutingRun3;

int32_t ET(0), Eta(0), Phi(0), Qual(0);
for (uint32_t i = 0; i < 6; i++) {
for (int i = 0; i < nObjets; i++) {
ET = ((dataBlock[i] >> demux::shiftsJet::ET) & demux::masksJet::ET);

if (ET != 0) {
Expand All @@ -153,11 +254,11 @@ void ScCaloRawToDigi::unpackLinkJets(uint32_t* dataBlock, int bx) {
} // end link jets unpacking loop
}

void ScCaloRawToDigi::unpackLinkEGammas(uint32_t* dataBlock, int bx) {
void ScCaloRawToDigi::unpackEGammas(uint32_t* dataBlock, int bx, int nObjets) {
using namespace l1ScoutingRun3;

int32_t ET(0), Eta(0), Phi(0), Iso(0);
for (uint32_t i = 0; i < 6; i++) {
for (int i = 0; i < nObjets; i++) {
ET = ((dataBlock[i] >> demux::shiftsEGamma::ET) & demux::masksEGamma::ET);
if (ET != 0) {
Eta = ((dataBlock[i] >> demux::shiftsEGamma::eta) & demux::masksEGamma::eta);
Expand All @@ -180,11 +281,11 @@ void ScCaloRawToDigi::unpackLinkEGammas(uint32_t* dataBlock, int bx) {
} // end link e/gammas unpacking loop
}

void ScCaloRawToDigi::unpackLinkTaus(uint32_t* dataBlock, int bx) {
void ScCaloRawToDigi::unpackTaus(uint32_t* dataBlock, int bx, int nObjets) {
using namespace l1ScoutingRun3;

int32_t ET(0), Eta(0), Phi(0), Iso(0);
for (uint32_t i = 0; i < 6; i++) {
for (int i = 0; i < nObjets; i++) {
ET = ((dataBlock[i] >> demux::shiftsTau::ET) & demux::masksTau::ET);
if (ET != 0) {
Eta = ((dataBlock[i] >> demux::shiftsTau::eta) & demux::masksTau::eta);
Expand Down Expand Up @@ -212,12 +313,12 @@ void ScCaloRawToDigi::unpackEtSums(uint32_t* dataBlock, int bx) {

BxSums bxSums;

int32_t ETEt(0), ETEttem(0), ETMinBiasHFP0(0); // ET
int32_t HTEt(0), HTtowerCount(0), HTMinBiasHFM0(0); // HT
int32_t ETmissEt(0), ETmissPhi(0), ETmissASYMET(0), ETmissMinBiasHFP1(0); //ETMiss
int32_t HTmissEt(0), HTmissPhi(0), HTmissASYMHT(0), HTmissMinBiasHFM1(0); // HTMiss
int32_t ETHFmissEt(0), ETHFmissPhi(0), ETHFmissASYMETHF(0), ETHFmissCENT(0); // ETHFMiss
int32_t HTHFmissEt(0), HTHFmissPhi(0), HTHFmissASYMHTHF(0), HTHFmissCENT(0); // HTHFMiss
int32_t ETEt(0), ETEttem(0), ETMinBiasHFP0(0); // ET block
int32_t HTEt(0), HTtowerCount(0), HTMinBiasHFM0(0); // HT block
int32_t ETmissEt(0), ETmissPhi(0), ETmissASYMET(0), ETmissMinBiasHFP1(0); // ETMiss block
int32_t HTmissEt(0), HTmissPhi(0), HTmissASYMHT(0), HTmissMinBiasHFM1(0); // HTMiss block
int32_t ETHFmissEt(0), ETHFmissPhi(0), ETHFmissASYMETHF(0), ETHFmissCENT(0); // ETHFMiss block
int32_t HTHFmissEt(0), HTHFmissPhi(0), HTHFmissASYMHTHF(0), HTHFmissCENT(0); // HTHFMiss block

// ET block
ETEt = ((dataBlock[0] >> demux::shiftsESums::ETEt) & demux::masksESums::ETEt);
Expand Down Expand Up @@ -321,8 +422,20 @@ void ScCaloRawToDigi::unpackEtSums(uint32_t* dataBlock, int bx) {

void ScCaloRawToDigi::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
edm::ParameterSetDescription desc;
desc.setUnknown();
descriptions.addDefault(desc);
desc.add<edm::InputTag>("srcInputTag", edm::InputTag("rawDataCollector"));
{
edm::ParameterSetDescription dataSource;
dataSource.add<std::string>("dataSourceMode", std::string("TCP"));
dataSource.add<std::vector<int>>("jetSourceIdList", std::vector<int>({22}));
dataSource.add<std::vector<int>>("eGammaSourceIdList", std::vector<int>({23}));
dataSource.add<std::vector<int>>("tauSourceIdList", std::vector<int>({25}));
dataSource.add<std::vector<int>>("etSumSourceIdList", std::vector<int>({24}));
dataSource.add<int>("dmaSourceId", 2);
desc.add("dataSource", dataSource);
}
desc.add<bool>("enableAllSums", true);
desc.addUntracked<bool>("debug", false);
descriptions.add("ScCaloRawToDigi", desc);
}

DEFINE_FWK_MODULE(ScCaloRawToDigi);
Loading

0 comments on commit c1f48bd

Please sign in to comment.