Skip to content

Commit 50b7b86

Browse files
authored
Merge pull request #47952 from smorovic/151-daqsource-fix
[DAQ] Improved event checks (15_1_X)
2 parents 1fa6fd5 + 2e62b50 commit 50b7b86

16 files changed

+419
-108
lines changed

EventFilter/Utilities/interface/DAQSource.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
#ifndef EventFilter_Utilities_DAQSource_h
22
#define EventFilter_Utilities_DAQSource_h
33

4+
/*
5+
* DAQSource - modular input source supporting multiple
6+
* buffering strategies and data formats. Specific formats are included
7+
* as models defined as DataMode child class.
8+
* Source supports DAQ file protocol using specific input file naming schema
9+
* and JSON metadata files.
10+
* See doc/READHME-DTH.md for more information, including file naming formats
11+
*/
12+
413
#include <condition_variable>
514
#include <cstdio>
615
#include <filesystem>
@@ -104,6 +113,7 @@ class DAQSource : public edm::RawInputSource {
104113
// get LS from filename instead of event header
105114
const bool alwaysStartFromFirstLS_;
106115
const bool verifyChecksum_;
116+
const bool inputConsistencyChecks_;
107117
const bool useL1EventID_;
108118
const std::vector<unsigned int> testTCDSFEDRange_;
109119
std::vector<std::string> listFileNames_;

EventFilter/Utilities/interface/DAQSourceModels.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
#ifndef EventFilter_Utilities_DAQSourceModels_h
22
#define EventFilter_Utilities_DAQSourceModels_h
33

4+
/*
5+
* Base class defining modular interface for DAQSource data models
6+
* See doc/README-DTH.md for interface description
7+
*/
8+
49
#include <condition_variable>
510
#include <cstdio>
611
#include <filesystem>

EventFilter/Utilities/interface/DAQSourceModelsDTH.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
#ifndef EventFilter_Utilities_DAQSourceModelsDTH_h
22
#define EventFilter_Utilities_DAQSourceModelsDTH_h
33

4+
/*
5+
* DAQ Source module for DTH readout
6+
* Used by modular DAQSource to read files containing raw DTH orbit payload.
7+
* Orbits are unpacked into individual events which are queued to the framework as FedRawDataCollection object.
8+
* If more than one sourceID blocks is included they will all be unpacked, they need to be adjacent in the file
9+
* for the same orbit. Exception to this is reading from multiple file sources,
10+
* in that case that is only required locally in a file, but orbits need to come in the same order in all files.
11+
* See test/RunBUFU.sh and test/testDTH.sh for example how to run with this module
12+
* Also see documentation in doc/README=DTH.md
13+
*/
14+
415
#include <filesystem>
516
#include <queue>
617
#include <regex>

EventFilter/Utilities/interface/DAQSourceModelsFRD.h

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
11
#ifndef EventFilter_Utilities_DAQSourceModelsFRD_h
22
#define EventFilter_Utilities_DAQSourceModelsFRD_h
33

4+
/*
5+
* DAQSource data model classes for reading Run3 FRD format and unpacking into the FedRawDataCollection
6+
* FRD: standard readout of input from the event builder
7+
* FRDPreUNpack: variant unpacking events tns nto FedRawDataCollection class in reader threads
8+
* FRSStiped: more generic version able to read from multiple source
9+
* directories (Super-Fragmeng Builder DAQ)
10+
* */
11+
412
#include <filesystem>
513
#include <queue>
14+
#include "oneapi/tbb/concurrent_unordered_set.h"
615

716
#include "EventFilter/Utilities/interface/DAQSourceModels.h"
817
#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
918

1019
class FEDRawDataCollection;
1120

21+
/*
22+
* FRD unpacker equivalent to the FedRawDataInputSource
23+
*/
24+
1225
class DataModeFRD : public DataMode {
1326
public:
27+
DataModeFRD(DAQSource* daqSource, bool verifyFEDs) : DataMode(daqSource), verifyFEDs_(verifyFEDs) {}
1428
DataModeFRD(DAQSource* daqSource) : DataMode(daqSource) {}
1529
~DataModeFRD() override {}
1630
std::vector<std::shared_ptr<const edm::DaqProvenanceHelper>>& makeDaqProvenanceHelpers() override;
@@ -82,21 +96,24 @@ class DataModeFRD : public DataMode {
8296
uint16_t MINTCDSuTCAFEDID_ = FEDNumbering::MINTCDSuTCAFEDID;
8397
uint16_t MAXTCDSuTCAFEDID_ = FEDNumbering::MAXTCDSuTCAFEDID;
8498
bool eventCached_ = false;
99+
std::unordered_set<unsigned short> fedIdSet_;
100+
unsigned int expectedFedsInEvent_ = 0;
101+
bool verifyFEDs_ = true;
85102
};
86103

87104
/*
88-
* FRD source prebuffering in reader thread
105+
* FRD source prebuffering in the reader thread
89106
*/
90107

91108
class DataModeFRDPreUnpack : public DataMode {
92109
public:
93-
DataModeFRDPreUnpack(DAQSource* daqSource) : DataMode(daqSource) {}
110+
DataModeFRDPreUnpack(DAQSource* daqSource, bool verifyFEDs) : DataMode(daqSource), verifyFEDs_(verifyFEDs) {}
94111
~DataModeFRDPreUnpack() override {};
95112
std::vector<std::shared_ptr<const edm::DaqProvenanceHelper>>& makeDaqProvenanceHelpers() override;
96113
void readEvent(edm::EventPrincipal& eventPrincipal) override;
97114

98115
//non-virtual
99-
void unpackEvent(edm::streamer::FRDEventMsgView* eview, UnpackedRawEventWrapper* ec);
116+
void unpackEvent(edm::streamer::FRDEventMsgView* eview, UnpackedRawEventWrapper* ec, unsigned int ls);
100117
void unpackFile(RawInputFile*) override;
101118
edm::Timestamp fillFEDRawDataCollection(edm::streamer::FRDEventMsgView* eview,
102119
FEDRawDataCollection& rawData,
@@ -164,16 +181,19 @@ class DataModeFRDPreUnpack : public DataMode {
164181
uint16_t MINTCDSuTCAFEDID_ = FEDNumbering::MINTCDSuTCAFEDID;
165182
uint16_t MAXTCDSuTCAFEDID_ = FEDNumbering::MAXTCDSuTCAFEDID;
166183
bool eventCached_ = false;
184+
oneapi::tbb::concurrent_unordered_set<unsigned short> fedIdSet_;
185+
std::atomic<unsigned int> expectedFedsInEvent_ = 0;
186+
bool verifyFEDs_ = true;
167187
};
168188

169189
/*
170-
* FRD source reading files from multiple striped destinations
190+
* FRD source reading files from multiple striped destinations (Super-Fragment Builder DAQ)
171191
*
172192
* */
173193

174194
class DataModeFRDStriped : public DataMode {
175195
public:
176-
DataModeFRDStriped(DAQSource* daqSource) : DataMode(daqSource) {}
196+
DataModeFRDStriped(DAQSource* daqSource, bool verifyFEDs) : DataMode(daqSource), verifyFEDs_(verifyFEDs) {}
177197
~DataModeFRDStriped() override {}
178198
std::vector<std::shared_ptr<const edm::DaqProvenanceHelper>>& makeDaqProvenanceHelpers() override;
179199
void readEvent(edm::EventPrincipal& eventPrincipal) override;
@@ -258,6 +278,9 @@ class DataModeFRDStriped : public DataMode {
258278
uint16_t MINTCDSuTCAFEDID_ = FEDNumbering::MINTCDSuTCAFEDID;
259279
uint16_t MAXTCDSuTCAFEDID_ = FEDNumbering::MAXTCDSuTCAFEDID;
260280
std::vector<std::filesystem::path> buPaths_;
281+
std::unordered_set<unsigned short> fedIdSet_;
282+
unsigned int expectedFedsInEvent_ = 0;
283+
bool verifyFEDs_ = true;
261284
};
262285

263286
#endif // EventFilter_Utilities_DAQSourceModelsFRD_h

EventFilter/Utilities/interface/FedRawDataInputSource.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ class FedRawDataInputSource : public edm::RawInputSource {
185185

186186
std::map<unsigned int, unsigned int> sourceEventsReport_;
187187
std::mutex monlock_;
188+
unsigned int expectedFedsInEvent_ = 0;
188189
};
189190

190191
#endif // EventFilter_Utilities_FedRawDataInputSource_h

EventFilter/Utilities/plugins/DaqFakeReader.cc

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,28 @@ DaqFakeReader::DaqFakeReader(const edm::ParameterSet& pset)
4141
injected_errors_per_million_events(pset.getUntrackedParameter<unsigned int>("injectErrPpm", 0)),
4242
tcdsFEDID_(pset.getUntrackedParameter<unsigned int>("tcdsFEDID", 1024)),
4343
modulo_error_events(injected_errors_per_million_events ? 1000000 / injected_errors_per_million_events
44-
: 0xffffffff) {
44+
: 0xffffffff),
45+
subsystems_(pset.getUntrackedParameter<std::vector<std::string>>("subsystems")) {
46+
for (auto const& subsystem : subsystems_) {
47+
if (subsystem == "TCDS")
48+
haveTCDS_ = true;
49+
else if (subsystem == "SiPixel")
50+
haveSiPixel_ = true;
51+
else if (subsystem == "SiStrip")
52+
haveSiStrip_ = true;
53+
else if (subsystem == "ECAL")
54+
haveECAL_ = true;
55+
else if (subsystem == "HCAL")
56+
haveHCAL_ = true;
57+
else if (subsystem == "DT")
58+
haveDT_ = true;
59+
else if (subsystem == "CSC")
60+
haveCSC_ = true;
61+
else if (subsystem == "RPC")
62+
haveRPC_ = true;
63+
}
4564
// mean = pset.getParameter<float>("mean");
46-
if (tcdsFEDID_ < FEDNumbering::MINTCDSuTCAFEDID)
65+
if (haveTCDS_ && tcdsFEDID_ < FEDNumbering::MINTCDSuTCAFEDID)
4766
throw cms::Exception("DaqFakeReader::DaqFakeReader")
4867
<< " TCDS FED ID lower than " << FEDNumbering::MINTCDSuTCAFEDID;
4968
if (fillRandom_) {
@@ -74,17 +93,25 @@ int DaqFakeReader::fillRawData(Event& e, FEDRawDataCollection*& data) {
7493
eventNum++;
7594
// FIXME:
7695

77-
fillFEDs(FEDNumbering::MINSiPixelFEDID, FEDNumbering::MAXSiPixelFEDID, eID, *data, meansize, width);
78-
fillFEDs(FEDNumbering::MINSiStripFEDID, FEDNumbering::MAXSiStripFEDID, eID, *data, meansize, width);
79-
fillFEDs(FEDNumbering::MINDTFEDID, FEDNumbering::MAXDTFEDID, eID, *data, meansize, width);
80-
fillFEDs(FEDNumbering::MINCSCFEDID, FEDNumbering::MAXCSCFEDID, eID, *data, meansize, width);
81-
fillFEDs(FEDNumbering::MINRPCFEDID, FEDNumbering::MAXRPCFEDID, eID, *data, meansize, width);
82-
fillFEDs(FEDNumbering::MINECALFEDID, FEDNumbering::MAXECALFEDID, eID, *data, meansize, width);
83-
fillFEDs(FEDNumbering::MINHCALFEDID, FEDNumbering::MAXHCALFEDID, eID, *data, meansize, width);
96+
if (haveSiPixel_)
97+
fillFEDs(FEDNumbering::MINSiPixelFEDID, FEDNumbering::MAXSiPixelFEDID, eID, *data, meansize, width);
98+
if (haveSiStrip_)
99+
fillFEDs(FEDNumbering::MINSiStripFEDID, FEDNumbering::MAXSiStripFEDID, eID, *data, meansize, width);
100+
if (haveECAL_)
101+
fillFEDs(FEDNumbering::MINECALFEDID, FEDNumbering::MAXECALFEDID, eID, *data, meansize, width);
102+
if (haveHCAL_)
103+
fillFEDs(FEDNumbering::MINHCALFEDID, FEDNumbering::MAXHCALFEDID, eID, *data, meansize, width);
104+
if (haveDT_)
105+
fillFEDs(FEDNumbering::MINDTFEDID, FEDNumbering::MAXDTFEDID, eID, *data, meansize, width);
106+
if (haveCSC_)
107+
fillFEDs(FEDNumbering::MINCSCFEDID, FEDNumbering::MAXCSCFEDID, eID, *data, meansize, width);
108+
if (haveRPC_)
109+
fillFEDs(FEDNumbering::MINRPCFEDID, FEDNumbering::MAXRPCFEDID, eID, *data, meansize, width);
84110

85111
timeval now;
86112
gettimeofday(&now, nullptr);
87-
fillTCDSFED(eID, *data, ls, &now);
113+
if (haveTCDS_)
114+
fillTCDSFED(eID, *data, ls, &now);
88115
}
89116
return 1;
90117
}
@@ -195,5 +222,8 @@ void DaqFakeReader::fillDescriptions(edm::ConfigurationDescriptions& description
195222
desc.addUntracked<unsigned int>("width", 1024);
196223
desc.addUntracked<unsigned int>("injectErrPpm", 1024);
197224
desc.addUntracked<unsigned int>("tcdsFEDID", 1024);
225+
desc.addUntracked<std::vector<std::string>>(
226+
"subsystems",
227+
std::initializer_list<std::string>({"TCDS", "SiPixel", "SiStrip", "ECAL", "HCAL", "DT", "CSC", "RPC"}));
198228
descriptions.add("DaqFakeReader", desc);
199229
}

EventFilter/Utilities/plugins/DaqFakeReader.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,15 @@ class DaqFakeReader : public edm::one::EDProducer<> {
5858
unsigned int tcdsFEDID_;
5959
unsigned int modulo_error_events;
6060
unsigned int fakeLs_ = 0;
61+
std::vector<std::string> subsystems_;
62+
bool haveTCDS_ = false;
63+
bool haveSiPixel_ = false;
64+
bool haveSiStrip_ = false;
65+
bool haveECAL_ = false;
66+
bool haveHCAL_ = false;
67+
bool haveDT_ = false;
68+
bool haveCSC_ = false;
69+
bool haveRPC_ = false;
6170
};
6271

6372
#endif

EventFilter/Utilities/src/DAQSource.cc

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ DAQSource::DAQSource(edm::ParameterSet const& pset, edm::InputSourceDescription
4343
maxBufferedFiles_(pset.getUntrackedParameter<unsigned int>("maxBufferedFiles")),
4444
alwaysStartFromFirstLS_(pset.getUntrackedParameter<bool>("alwaysStartFromFirstLS", false)),
4545
verifyChecksum_(pset.getUntrackedParameter<bool>("verifyChecksum")),
46+
inputConsistencyChecks_(pset.getUntrackedParameter<bool>("inputConsistencyChecks")),
4647
useL1EventID_(pset.getUntrackedParameter<bool>("useL1EventID")),
4748
testTCDSFEDRange_(pset.getUntrackedParameter<std::vector<unsigned int>>("testTCDSFEDRange")),
4849
listFileNames_(pset.getUntrackedParameter<std::vector<std::string>>("fileNames")),
@@ -83,11 +84,11 @@ DAQSource::DAQSource(edm::ParameterSet const& pset, edm::InputSourceDescription
8384

8485
//load mode class based on parameter
8586
if (dataModeConfig_ == "FRD") {
86-
dataMode_ = std::make_shared<DataModeFRD>(this);
87+
dataMode_ = std::make_shared<DataModeFRD>(this, inputConsistencyChecks_);
8788
} else if (dataModeConfig_ == "FRDPreUnpack") {
88-
dataMode_ = std::make_shared<DataModeFRDPreUnpack>(this);
89+
dataMode_ = std::make_shared<DataModeFRDPreUnpack>(this, inputConsistencyChecks_);
8990
} else if (dataModeConfig_ == "FRDStriped") {
90-
dataMode_ = std::make_shared<DataModeFRDStriped>(this);
91+
dataMode_ = std::make_shared<DataModeFRDStriped>(this, inputConsistencyChecks_);
9192
} else if (dataModeConfig_ == "ScoutingRun3") {
9293
dataMode_ = std::make_shared<DataModeScoutingRun3>(this);
9394
} else if (dataModeConfig_ == "DTH") {
@@ -259,6 +260,8 @@ void DAQSource::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
259260
->setComment("Force source to start from LS 1 if server provides higher lumisection number");
260261
desc.addUntracked<bool>("verifyChecksum", true)
261262
->setComment("Verify event CRC-32C checksum of FRDv5 and higher or Adler32 with v3 and v4");
263+
desc.addUntracked<bool>("inputConsistencyChecks", true)
264+
->setComment("Additional consistency checks such as checking that the FED ID set is the same in all events");
262265
desc.addUntracked<bool>("useL1EventID", false)
263266
->setComment("Use L1 event ID from FED header if true or from TCDS FED if false");
264267
desc.addUntracked<std::vector<unsigned int>>("testTCDSFEDRange", std::vector<unsigned int>())

0 commit comments

Comments
 (0)