77 std::cerr <<
"Error: too many files, the supported max file number is " <<
kMaxNumFiles << std::endl;
81 const uint32_t HeaderSize = 18;
82 uint32_t evtHeader[HeaderSize];
85 auto& _numEvents = m_subFile->i_numEvents;
89 m_subFile->i_datafn =
file;
90 uint32_t maxNumEvents = m_subFile->i_fidx->capacity() /
sizeof(
CgemEventIndex);
102 std::cerr <<
"Error: invalid data in file " <<
file << std::endl;
105 ifs.read(
reinterpret_cast<char*
>( evtHeader ), HeaderSize *
sizeof( uint32_t ) );
107 if ( _numEvents > maxNumEvents ) {
110 }
while (_numEvents > maxNumEvents);
113 uint32_t dataSize = (evtHeader[1] - evtHeader[2]) *
sizeof( uint32_t );
114 auto _eidx = _fidx + _numEvents - 1;
115 _eidx->
l1id = evtHeader[10 + evtHeader[5]];
116 _eidx->pos = ifs.tellg();
117 _eidx->size = dataSize;
118 ifs.seekg( dataSize, std::ios::cur );
122 _meta[m_numFiles].
lastL1id = _fidx[_numEvents-1].l1id;
123 _meta[m_numFiles].pos = m_fs.tellp();
126 m_fs.write(
reinterpret_cast<const char*
>(&_numEvents),
sizeof(uint32_t));
127 m_fs <<
file <<
'\n';
128 int sleft = 256 -
sizeof(uint32_t) * 2 - 1 -
file.size();
129 for (
int i = 0; i < sleft; ++i) {
132 m_fs.write(
reinterpret_cast<char*
>(_fidx), _numEvents *
sizeof(
CgemEventIndex));
135 std::cout <<
"CgemIndexFile: total " << _numEvents <<
" events in file " <<
file << std::endl;
187 if ( end > m_subFile->i_numEvents ) {
188 std::cerr <<
"Error: CgemIndexFile exceeds the max event number " << m_subFile->i_numEvents << std::endl;
193 for (uint32_t i = start; i < end; ++i) {
194 std::cout << std::setw( 12 ) << i <<
": L1ID" << std::setw( 12 ) << _fidx[i].l1id
195 <<
" Pos" << std::setw( 12 ) << _fidx[i].pos <<
" Size " << _fidx[i].size << std::endl;
201 if (
n < m_numFiles ) {
202 if ( m_subFiles[
n] !=
nullptr ) {
203 m_subFile = m_subFiles[
n];
206 m_subFiles[
n] =
new CgemSubFileContext();
207 m_subFile = m_subFiles[
n];
209 m_fs.seekg(_meta[
n].pos);
211 uint32_t subFileMeta[2];
212 m_fs.read(
reinterpret_cast<char*
>(subFileMeta),
sizeof(uint32_t) * 2 );
214 m_fs >> m_subFile->i_datafn;
215 if ( std::filesystem::exists( m_subFile->i_datafn ) ) {
216 m_subFile->i_numEvents = subFileMeta[1];
217 m_fs.seekg( _meta[
n].pos + 256 );
218 m_subFile->i_fidx->reserve<
CgemEventIndex>(m_subFile->i_numEvents);
219 m_fs.read( m_subFile->i_fidx->data<
char>(), m_subFile->i_numEvents *
sizeof(
CgemEventIndex ) );
223 std::cerr <<
"Error: CgemIndexFile can not find data file " << m_subFile->i_datafn << std::endl;
227 std::cerr <<
"Error: CgemIndexFile wrong SubFile marker" << std::endl;
231 std::cerr <<
"Error: CgemIndexFile exceeds the max SubFile number " << m_numFiles << std::endl;
238 uint32_t* _noCGEM = m_data->data<uint32_t>();
241 auto _idx = ( m_subFile != nullptr ) ? m_subFile->i_fidx->data<
CgemEventIndex>() :
nullptr;
242 if ( _idx ==
nullptr || _idx[0].l1id > l1id || _idx[m_subFile->i_numEvents - 1].l1id < l1id ) {
245 while ( _meta[_n].lastL1id < l1id ) {
246 if ( ++_n >= m_numFiles ) {
247 std::cerr <<
"Warning: CgemIndexFile can not find the index for L1ID+ " << l1id << std::endl;
252 if ( !m_subFile->i_datafs.is_open() ) {
253 m_subFile->i_datafs.open( m_subFile->i_datafn.c_str(), std::ios::binary );
258 uint32_t ii = l1id - _idx[0].
l1id;
261 if ( _idx[ii].l1id == l1id ) {
262 auto _cache = m_data->reserve<
char>( _idx[ii].size );
263 m_subFile->i_datafs.seekg( _idx[ii].pos );
264 m_subFile->i_datafs.read( _cache, _idx[ii].size );
265 uint32_t* _data =
reinterpret_cast<uint32_t*
>( _cache );
266 if ( _data[0] == 0xbb1234bb ) {
270 std::cerr <<
"Error: CgemIndexFile wrong SubDetector marker" << std::endl;
274 std::cerr <<
"Warning: CgemIndexFile can not find the index for L1ID- " << l1id << std::endl;