@@ -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
0 commit comments