Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[14_0_X] Update unpacker for L1T Calo scouting + DataFormat tests #44394

Merged
merged 6 commits into from
Apr 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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