Skip to content

Commit 63df43b

Browse files
committed
rearrange code; preview header before reading full file or copying buffer
1 parent df4f545 commit 63df43b

File tree

4 files changed

+123
-45
lines changed

4 files changed

+123
-45
lines changed

ALICE3/Core/FlatLutEntry.cxx

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -167,16 +167,14 @@ void FlatLutData::view(const uint8_t* buffer, size_t size)
167167

168168
void FlatLutData::validateBuffer(const uint8_t* buffer, size_t size)
169169
{
170-
// Validate buffer
171-
if (size < sizeof(lutHeader_t)) {
172-
throw framework::runtime_error_f("Buffer too small for LUT header: expected at least %zu, got %zu", sizeof(lutHeader_t), size);
170+
auto header = PreviewHeader(buffer, size);
171+
if (!header.check_version()) {
172+
throw framework::runtime_error_f("LUT header version mismatch: expected %d, got %d", LUTCOVM_VERSION, header.version);
173173
}
174-
175-
const auto* header = reinterpret_cast<const lutHeader_t*>(buffer);
176-
auto mNchBins = header->nchmap.nbins;
177-
auto mRadBins = header->radmap.nbins;
178-
auto mEtaBins = header->etamap.nbins;
179-
auto mPtBins = header->ptmap.nbins;
174+
auto mNchBins = header.nchmap.nbins;
175+
auto mRadBins = header.radmap.nbins;
176+
auto mEtaBins = header.etamap.nbins;
177+
auto mPtBins = header.ptmap.nbins;
180178

181179
size_t expectedSize = sizeof(lutHeader_t) + static_cast<size_t>(mNchBins) * mRadBins * mEtaBins * mPtBins * sizeof(lutEntry_t);
182180

@@ -185,6 +183,18 @@ void FlatLutData::validateBuffer(const uint8_t* buffer, size_t size)
185183
}
186184
}
187185

186+
lutHeader_t FlatLutData::PreviewHeader(const uint8_t* buffer, size_t size)
187+
{
188+
if (size < sizeof(lutHeader_t)) {
189+
throw framework::runtime_error_f("Buffer too small for LUT header: expected at least %zu, got %zu", sizeof(lutHeader_t), size);
190+
}
191+
const auto* header = reinterpret_cast<const lutHeader_t*>(buffer);
192+
if (!header->check_version()) {
193+
throw framework::runtime_error_f("LUT header version mismatch: expected %d, got %d", LUTCOVM_VERSION, header->version);
194+
}
195+
return *header;
196+
}
197+
188198
FlatLutData FlatLutData::AdoptFromBuffer(const uint8_t* buffer, size_t size)
189199
{
190200
validateBuffer(buffer, size);
@@ -211,23 +221,23 @@ bool FlatLutData::isLoaded() const
211221
return ((!mData.empty()) || (!mDataRef.empty()));
212222
}
213223

214-
FlatLutData FlatLutData::loadFromFile(const char* filename)
224+
lutHeader_t FlatLutData::PreviewHeader(std::ifstream& file, const char* filename)
215225
{
216-
std::ifstream lutFile(filename, std::ifstream::binary);
217-
if (!lutFile.is_open()) {
218-
throw framework::runtime_error_f("Cannot open LUT file: %s", filename);
219-
}
220-
221-
// Read header first
222226
lutHeader_t tempHeader;
223-
lutFile.read(reinterpret_cast<char*>(&tempHeader), sizeof(lutHeader_t));
224-
if (lutFile.gcount() != static_cast<std::streamsize>(sizeof(lutHeader_t))) {
227+
file.read(reinterpret_cast<char*>(&tempHeader), sizeof(lutHeader_t));
228+
if (file.gcount() != static_cast<std::streamsize>(sizeof(lutHeader_t))) {
225229
throw framework::runtime_error_f("Failed to read LUT header from %s", filename);
226230
}
227-
228231
if (!tempHeader.check_version()) {
229232
throw framework::runtime_error_f("LUT header version mismatch: expected %d, got %d", LUTCOVM_VERSION, tempHeader.version);
230233
}
234+
return tempHeader;
235+
}
236+
237+
FlatLutData FlatLutData::loadFromFile(std::ifstream& file, const char* filename)
238+
{
239+
// Read header first
240+
lutHeader_t tempHeader = PreviewHeader(file, filename);
231241

232242
FlatLutData data;
233243

@@ -239,12 +249,11 @@ FlatLutData FlatLutData::loadFromFile(const char* filename)
239249
size_t numEntries = static_cast<size_t>(data.mNchBins) * data.mRadBins * data.mEtaBins * data.mPtBins;
240250
size_t entriesSize = numEntries * sizeof(lutEntry_t);
241251

242-
lutFile.read(reinterpret_cast<char*>(data.data() + headerSize), entriesSize);
243-
if (lutFile.gcount() != static_cast<std::streamsize>(entriesSize)) {
244-
throw framework::runtime_error_f("Failed to read LUT entries from %s: expected %zu bytes, got %zu", filename, entriesSize, static_cast<size_t>(lutFile.gcount()));
252+
file.read(reinterpret_cast<char*>(data.data() + headerSize), entriesSize);
253+
if (file.gcount() != static_cast<std::streamsize>(entriesSize)) {
254+
throw framework::runtime_error_f("Failed to read LUT entries from %s: expected %zu bytes, got %zu", filename, entriesSize, static_cast<size_t>(file.gcount()));
245255
}
246256

247-
lutFile.close();
248257
LOGF(info, "Successfully loaded LUT from %s: %zu entries", filename, numEntries);
249258
return data;
250259
}

ALICE3/Core/FlatLutEntry.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,17 @@ class FlatLutData
146146
/**
147147
* @brief Construct a new FlatLutData from a file
148148
*/
149-
static FlatLutData loadFromFile(const char* filename);
149+
static FlatLutData loadFromFile(std::ifstream& file, const char* filename);
150+
151+
/**
152+
* @brief Preview buffer header for version and other compatibility checks
153+
*/
154+
static lutHeader_t PreviewHeader(const uint8_t* buffer, size_t size);
155+
156+
/**
157+
* @brief Preview file-stored header for version and other compatibility checks
158+
*/
159+
static lutHeader_t PreviewHeader(std::ifstream& file, const char* filename);
150160

151161
/**
152162
* @brief Check if the LUT is loaded

ALICE3/Core/FlatTrackSmearer.cxx

Lines changed: 76 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -77,25 +77,95 @@ bool TrackSmearer::loadTable(int pdg, const char* filename, bool forceReload)
7777
}
7878

7979
const auto ipdg = getIndexPDG(pdg);
80-
LOGF(info, "Loading %s LUT file: '%s'", getParticleName(pdg), filename);
81-
8280
if (mLUTData[ipdg].isLoaded() && !forceReload) {
8381
LOGF(info, "LUT table for PDG %d already loaded (index %d)", pdg, ipdg);
8482
return false;
8583
}
8684

85+
std::ifstream lutFile(filename, std::ifstream::binary);
86+
if (!lutFile.is_open()) {
87+
throw framework::runtime_error_f("Cannot open LUT file: %s", filename);
88+
}
89+
90+
LOGF(info, "Loading %s LUT file: '%s'", getParticleName(pdg), filename);
8791
const std::string localFilename = o2::fastsim::GeometryEntry::accessFile(filename, "./.ALICE3/LUTs/", mCcdbManager, 10);
8892

8993
try {
90-
mLUTData[ipdg] = FlatLutData::loadFromFile(localFilename.c_str());
94+
auto header = FlatLutData::PreviewHeader(lutFile, localFilename.c_str());
95+
// Validate header
96+
if (header.pdg != pdg && !checkSpecialCase(pdg, header)) {
97+
LOGF(error, "LUT header PDG mismatch: expected %d, got %d; not loading", pdg, header.pdg);
98+
return false;
99+
}
100+
mLUTData[ipdg] = FlatLutData::loadFromFile(lutFile, localFilename.c_str());
91101
} catch (framework::RuntimeErrorRef ref) {
92102
LOGF(error, "%s", framework::error_from_ref(ref).what);
93103
return false;
94104
}
105+
mHeaders[ipdg] = &mLUTData[ipdg].getHeaderRef();
95106

96-
// Validate header
97-
const auto& header = mLUTData[ipdg].getHeaderRef();
107+
LOGF(info, "Successfully read LUT for PDG %d: %s", pdg, localFilename.c_str());
108+
mHeaders[ipdg]->print();
109+
return true;
110+
}
98111

112+
bool TrackSmearer::adoptTable(int pdg, const uint8_t* buffer, size_t size, bool forceReload)
113+
{
114+
const auto ipdg = getIndexPDG(pdg);
115+
if (mLUTData[ipdg].isLoaded() && !forceReload) {
116+
LOGF(info, "LUT table for PDG %d already loaded (index %d)", pdg, ipdg);
117+
return false;
118+
}
119+
try {
120+
auto header = FlatLutData::PreviewHeader(buffer, size);
121+
if (header.pdg != pdg && !checkSpecialCase(pdg, header)) {
122+
LOGF(error, "LUT header PDG mismatch: expected %d, got %d", pdg, header.pdg);
123+
return false;
124+
}
125+
mLUTData[ipdg] = FlatLutData::AdoptFromBuffer(buffer, size);
126+
} catch (framework::RuntimeErrorRef ref) {
127+
LOGF(error, "%s", framework::error_from_ref(ref).what);
128+
}
129+
mHeaders[ipdg] = &mLUTData[ipdg].getHeaderRef();
130+
131+
LOGF(info, "Successfully adopted LUT for PDG %d", pdg);
132+
mHeaders[ipdg]->print();
133+
return true;
134+
}
135+
136+
bool TrackSmearer::viewTable(int pdg, const uint8_t* buffer, size_t size, bool forceReload)
137+
{
138+
const auto ipdg = getIndexPDG(pdg);
139+
if (mLUTData[ipdg].isLoaded() && !forceReload) {
140+
LOGF(info, "LUT table for PDG %d already loaded (index %d)", pdg, ipdg);
141+
return false;
142+
}
143+
try {
144+
auto header = FlatLutData::PreviewHeader(buffer, size);
145+
if (header.pdg != pdg && !checkSpecialCase(pdg, header)) {
146+
LOGF(error, "LUT header PDG mismatch: expected %d, got %d", pdg, header.pdg);
147+
return false;
148+
}
149+
mLUTData[ipdg] = FlatLutData::ViewFromBuffer(buffer, size);
150+
} catch (framework::RuntimeErrorRef ref) {
151+
LOGF(error, "%s", framework::error_from_ref(ref).what);
152+
}
153+
mHeaders[ipdg] = &mLUTData[ipdg].getHeaderRef();
154+
155+
LOGF(info, "Successfully adopted LUT for PDG %d", pdg);
156+
mHeaders[ipdg]->print();
157+
return true;
158+
}
159+
160+
bool TrackSmearer::hasTable(int pdg) const
161+
{
162+
const int ipdg = getIndexPDG(pdg);
163+
return mLUTData[ipdg].isLoaded();
164+
}
165+
166+
bool TrackSmearer::checkSpecialCase(int pdg, lutHeader_t const& header)
167+
{
168+
// Validate header
99169
bool specialPdgCase = false;
100170
switch (pdg) {
101171
case o2::constants::physics::kAlpha:
@@ -108,23 +178,8 @@ bool TrackSmearer::loadTable(int pdg, const char* filename, bool forceReload)
108178
default:
109179
break;
110180
}
111-
112-
if (header.pdg != pdg && !specialPdgCase) {
113-
LOGF(error, "LUT header PDG mismatch: expected %d, got %d", pdg, header.pdg);
114-
mLUTData[ipdg].reset();
115-
return false;
116-
}
117-
118-
LOGF(info, "Successfully read LUT for PDG %d: %s", pdg, localFilename.c_str());
119-
header.print();
120-
121-
return true;
181+
return specialPdgCase;
122182
}
123183

124-
bool TrackSmearer::hasTable(int pdg) const
125-
{
126-
const int ipdg = getIndexPDG(pdg);
127-
return mLUTData[ipdg].isLoaded();
128-
}
129184

130185
} // namespace o2::delphes

ALICE3/Core/FlatTrackSmearer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ class TrackSmearer
3030

3131
/** LUT methods **/
3232
bool loadTable(int pdg, const char* filename, bool forceReload = false);
33+
bool adoptTable(int pdg, const uint8_t* buffer, size_t size, bool forceReload = false);
34+
bool viewTable(int pdg, const uint8_t* buffer, size_t size, bool forceReload = false);
3335
bool hasTable(int pdg) const;
3436

3537
void useEfficiency(bool val) { mUseEfficiency = val; }
@@ -69,6 +71,8 @@ class TrackSmearer
6971

7072
private:
7173
o2::ccdb::BasicCCDBManager* mCcdbManager = nullptr;
74+
75+
bool checkSpecialCase(int pdg, lutHeader_t const& header);
7276
};
7377

7478
} // namespace o2::delphes

0 commit comments

Comments
 (0)