ATLAS Offline Software
v5_DataWriter.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include <time.h>
6 #include <sstream>
7 #include <stdlib.h>
8 #include "v5_Guid.h"
9 #include "ers/ers.h"
10 
11 #include <boost/shared_ptr.hpp>
12 
14 #include "EventStorage/DataWriterCallBack.h"
15 #include "EventStorage/FileNameCallback.h"
16 #include "EventStorage/RawFileName.h"
17 #include "EventStorage/EventStorageIssues.h"
18 #include "EventStorage/SimpleFileName.h"
19 #include "v5_DataBuffer.h"
20 
21 #include <sys/types.h>
22 #include <sys/stat.h>
23 #include <unistd.h>
24 #include <stdio.h>
25 
26 using namespace std;
27 using namespace offline_EventStorage_v5;
28 using EventStorage::DataWriterCallBack;
29 using EventStorage::DWError;
30 using EventStorage::FileNameCallback;
31 using EventStorage::SimpleFileName;
32 
33 namespace{
34  char *
35  charAddress(auto & val){
36  return reinterpret_cast<char *>(&val);
37  }
38  const char *
39  ccharAddress(const auto & val){
40  return reinterpret_cast<const char *>(&val);
41  }
42 
43  Bytef * //Bytef is defined in zlib
44  bytefAddress(auto & val){
45  return reinterpret_cast<Bytef *>(&val);
46  }
47  const Bytef * //Bytef is defined in zlib
48  cbytefAddress(auto & val){
49  return reinterpret_cast<const Bytef *>(&val);
50  }
51 
52 }
53 
54 // constructors
55 DataWriter::
56 DataWriter(const string& writingPath,
57  boost::shared_ptr<FileNameCallback> theFNCB,
58  const run_parameters_record& rPar,
59  const std::string& project,
60  const std::string& streamType,
61  const std::string& streamName,
62  const std::string& stream,
63  const unsigned int lumiBlockNumber,
64  const std::string& applicationName,
65  const std::vector<std::string>& fmdStrings,
67  const unsigned int compLevel)
68 {
69  initDW(writingPath, theFNCB, rPar, project, streamType, streamName, stream, lumiBlockNumber, applicationName, fmdStrings, compression, compLevel);
70 
71 }
72 
73 DataWriter::
74 DataWriter(const string& writingPath,
75  const string& fileNameCore,
76  const run_parameters_record& rPar,
77  const freeMetaDataStrings& fmdStrings,
78  const unsigned int startIndex,
80  const unsigned int compLevel)
81 {
82  boost::shared_ptr<daq::RawFileName>
83  fileName(new daq::RawFileName(fileNameCore));
84 
85  if ( fileName->hasValidCore() ) {
86  m_project = fileName->project();
87  m_streamType = fileName->streamType();
88  m_streamName = fileName->streamName();
89  m_stream = fileName->stream();
90  m_lumiBlockNumber = fileName->lumiBlockNumber();
91  m_applicationName = fileName->applicationName();
92  } else {
93  std::stringstream mystream;
94  mystream << "FileName " << fileName->fileName()
95  << " has failed interpretation."
96  << " The file header will have no values for "
97  << " project, stream, lumiBlock and appName";
98  ERS_DEBUG(1,mystream.str());
99  // EventStorage::RawFileNameIssue myissue(ERS_HERE, mystream.str().c_str() );
100  // ers::warning(myissue);
101  m_project = "";
102  m_streamType = "";
103  m_streamName = "";
104  m_stream = "";
105  m_lumiBlockNumber = 0;
106  m_applicationName = "";
107  }
108 
109  fileName->setFileSequenceNumber(startIndex);
110 
111  initDW(writingPath, fileName, rPar, m_project, m_streamType, m_streamName,
112  m_stream, m_lumiBlockNumber, m_applicationName,
113  fmdStrings, compression,compLevel);
114 
115 }
116 
117 
118 DataWriter::
119 DataWriter(const string& writingPath,
120  const string& fileNameCore,
121  const run_parameters_record& rPar,
122  const std::string& project,
123  const std::string& streamType,
124  const std::string& streamName,
125  const std::string& stream,
126  const unsigned int lumiBlockNumber,
127  const std::string& applicationName,
128  const std::vector<std::string>& fmdStrings,
130  const unsigned int compLevel)
131 {
132  boost::shared_ptr<FileNameCallback> fileName(new SimpleFileName(fileNameCore));
133  initDW(writingPath, fileName, rPar, project, streamType, streamName, stream, lumiBlockNumber, applicationName, fmdStrings, compression, compLevel);
134 
135 }
136 
137 // destructor
138 DataWriter::~DataWriter()
139 {
140  ERS_DEBUG(1,"DataWriter::~DataWriter() called.");
141 
142  m_file_end_record.status = 1; // This identifies the end of the sequence.
143  if(m_cFileOpen) closeFile();
144 
145  delete m_compressed;
146 
147  ERS_DEBUG(1,"DataWriter::~DataWriter() finished.");
148 }
149 
150 
151 void DataWriter::
152 initDW(const string& writingPath,
153  boost::shared_ptr<FileNameCallback> theFNCB,
154  const run_parameters_record& rPar,
155  const std::string& project,
156  const std::string& streamType,
157  const std::string& streamName,
158  const std::string& stream,
159  const unsigned int lumiBlockNumber,
160  const std::string& applicationName,
161  const std::vector<std::string>& fmdStrings,
163  const unsigned int compLevel)
164 {
165  m_project = project;
166  m_streamType = streamType;
167  m_streamName = streamName;
168  m_stream = stream;
169  m_lumiBlockNumber = lumiBlockNumber;
170  m_applicationName = applicationName;
171 
172  m_filenamecallback = theFNCB;
173 
174  reset_record(&m_file_start_record,&file_start_pattern);
175  reset_record(&m_internal_run_parameters_record,&run_parameters_pattern);
176  reset_record(&m_file_end_record,&file_end_pattern);
177  m_cFileMB = 0.0;
178  m_runMB = 0.0;
179  m_latestPosition = -1;
180 
181  m_writePath = writingPath;
182  m_nextWritePath = "";
183  //m_fileNameCore = fileNameCore;
184 
185  m_file_name_strings.appName = m_applicationName;
186  // m_file_name_strings.appName = getAppName(fileNameCore);
187  m_file_name_strings.fileNameCore = m_filenamecallback->getCoreName();
188 
189  setRunParamsRecord(rPar);
190 
191  m_file_start_record.sizeLimit_MB = 0;
192  m_file_start_record.sizeLimit_dataBlocks = 0;
193  date_timeAsInt(m_file_start_record.date,m_file_start_record.time);
194 
195  m_cFileOpen=false;
196  m_openFailed = false;
197 
198  m_callBack = NULL;
199 
200  m_fmdStrings = fmdStrings;
201 
202  m_compression = compression;
203  m_complevel = compLevel;
204  m_compressed = new DataBuffer();
205 
206  // add stream, project, compression, lumiBlock
207  // (if they are valid) to meta-data:
208  m_fmdStrings.push_back("Stream=" + m_stream );
209  m_fmdStrings.push_back("Project=" + m_project );
210  std::ostringstream o;
211  o << m_lumiBlockNumber;
212  m_fmdStrings.push_back("LumiBlock=" + o.str());
213 
214  if(m_compression != offline_EventStorage_v5::NONE){
215  m_fmdStrings.push_back(offline_EventStorage_v5::compressiontag +
216  "=" + offline_EventStorage_v5::type_to_string(m_compression));
217  }
218 
219  m_check = ::adler32(0L, Z_NULL, 0);
220 
221  m_guid = "";
222  m_next_guid = "";
223  this->spaceForGuid();
224  this->openNextFile();
225 
226 }
227 
228 
229 // */
230 
231 
232 //date and time utility
233 void DataWriter::date_timeAsInt(uint32_t &getDate, uint32_t &getTime) const
234 {
235  long a_time;
236  time(&a_time);
237 
238  struct tm t;
239  localtime_r( &a_time, &t);
240 
241  getDate= 1000000*t.tm_mday+
242  10000*(1+t.tm_mon)+
243  1900+t.tm_year;
244 
245  getTime= 10000*t.tm_hour+
246  100*t.tm_min+
247  t.tm_sec ;
248 }
249 
250 
251 bool DataWriter::good() const
252 {
253 
254  if(m_openFailed) return false;
255 
256  if(m_cFileOpen)
257  {
258  return m_cFile.good();
259  }
260  else
261  {
262  return true;
263  }
264 
265 }
266 
267 
268 // configuration
269 DWError DataWriter::setMaxFileMB(const unsigned int& maxFileMB)
270 {
271  m_file_start_record.sizeLimit_MB = maxFileMB;
272  return EventStorage::DWOK;
273 }
274 
275 DWError DataWriter::setMaxFileNE(const unsigned int& maxFileNE)
276 {
277  m_file_start_record.sizeLimit_dataBlocks = maxFileNE;
278  return EventStorage::DWOK;
279 }
280 
281 void DataWriter::setRunParamsRecord(const run_parameters_record& rPar)
282 {
283  // accept the params, whatever they are
284  // run number is in this record (and only there)
285  m_internal_run_parameters_record.marker = rPar.marker;
286  m_internal_run_parameters_record.record_size = rPar.record_size;
287  m_internal_run_parameters_record.run_number = rPar.run_number;
288  m_internal_run_parameters_record.max_events = rPar.max_events;
289  m_internal_run_parameters_record.rec_enable = rPar.rec_enable;
290  m_internal_run_parameters_record.trigger_type = rPar.trigger_type;
291  m_internal_run_parameters_record.detector_mask_1of2 = rPar.detector_mask & 0xFFFFFFFF;
292  m_internal_run_parameters_record.detector_mask_2of2 = (rPar.detector_mask>> 32);
293  m_internal_run_parameters_record.beam_type = rPar.beam_type;
294  m_internal_run_parameters_record.beam_energy = rPar.beam_energy;
295 }
296 
297 // output of data
298 DWError DataWriter::putData(const unsigned int& dataSize, const void *event)
299 {
300 
301  uint32_t todisk;
303  iov.iov_base = event;
304  iov.iov_len = dataSize;
305  return this->putData(1, &iov, todisk);
306 }
307 
308 // output of scattered data using iovec
309 DWError DataWriter::putData(const unsigned int& entries, const struct iovec * my_iovec)
310 {
311  uint32_t todisk;
312  return this->putData(entries, my_iovec, todisk);
313 }
314 
315 DWError DataWriter::putData(const unsigned int& dataSize, const void *event, uint32_t& sizeToDisk){
316 
318  iov.iov_base = event;
319  iov.iov_len = dataSize;
320  return this->putData(1, &iov, sizeToDisk);
321 }
322 
323 DWError DataWriter::putData(const unsigned int& entries, const iovec_const * my_iovec, uint32_t& sizeToDisk){
324  return this->putData_implementation(entries, my_iovec, sizeToDisk);
325 }
326 
327 
328 DWError DataWriter::putPrecompressedData(const unsigned int& dataSize,
329  const void *event){
330 
332  iov.iov_base = event;
333  iov.iov_len = dataSize;
334  return this->putPrecompressedData(1, &iov);
335 }
336 
337 
338 DWError DataWriter::putPrecompressedData(const unsigned int& entries,
339  const iovec_const* my_iovec){
340 
341  uint32_t todisk;
342  return this->putData_implementation(entries, my_iovec, todisk, true);
343 }
344 
345 
346 DWError DataWriter::putData_implementation(const unsigned int& entries, const iovec_const * my_iovec, uint32_t& sizeToDisk, bool precompressed){
347 
348  ERS_DEBUG(3,"DataWriter::putData called for an iovec.");
349  if(!m_cFileOpen) openNextFile();
350 
351  if(!m_cFileOpen) return EventStorage::DWNOOK;
352 
353  if(!m_cFile.good()) return EventStorage::DWNOOK;
354 
355  // calculate events size
356  unsigned int dataSize = 0;
357  for(unsigned int i = 0; i<entries; i++) {
358  dataSize += my_iovec[i].iov_len;
359  }
360 
361 
362 
363  sizeToDisk = dataSize;
364 
365 
366  // apply limits
367  if(m_file_start_record.sizeLimit_MB>0) {
368  double eventMB=static_cast<double>(dataSize)/(1024*1024);
369  double dataMB=m_cFileMB+eventMB;
370  if(static_cast<unsigned int>(dataMB+0.5) >
371  m_file_start_record.sizeLimit_MB) {
372  ERS_DEBUG(3,"Approaching file size limit in MB.");
373  nextFile();
374  }
375  }
376 
377  if((m_file_start_record.sizeLimit_dataBlocks>0) &&
378  (m_file_end_record.events_in_file >= m_file_start_record.sizeLimit_dataBlocks)){
379  ERS_DEBUG(3,"Approaching file size limit in number of events.");
380  nextFile();
381  }
382 
383  //Here we should compress, so that we have the effective size
384  //for the event record
385  if(m_compression == ZLIB && !precompressed){
386  try{
387  offline_EventStorage_v5::zlibcompress(*m_compressed, sizeToDisk,
388  entries, my_iovec, dataSize, m_complevel);
389  }catch(offline_EventStorage_v5::CompressionIssue& ex){
390  EventStorage::WritingIssue ci(ERS_HERE, "Data compression failed.", ex);
391  ers::error(ci);
392  return EventStorage::DWNOOK;
393  }
394  }
395 
396  // prepare the event record
398  dsR.data_block_number = m_file_end_record.events_in_run + 1;
399  dsR.data_block_size = sizeToDisk;
400 
401  // remember the position
402  m_latestPosition = m_cFile.tellg();
403 
404  // write the event record followed by event data
405  file_record(&dsR,&data_separator_pattern);
406 
407 
408  if(m_compression != ZLIB || precompressed){
409  for (unsigned int i =0; i<entries; i++){
410  m_cFile.write(static_cast<const char*>(my_iovec[i].iov_base),
411  my_iovec[i].iov_len);
412 
413  m_check = ::adler32(m_check,
414  static_cast<const Bytef *>(my_iovec[i].iov_base),
415  my_iovec[i].iov_len);
416  }
417  }else{
418  m_cFile.write(static_cast<const char *>(m_compressed->handle()), sizeToDisk);
419  m_check = ::adler32(m_check,
420  static_cast<const Bytef *>(m_compressed->handle()),
421  sizeToDisk);
422  }
423 
424  // update statistics
425  m_cFileMB += static_cast<double>(sizeToDisk)/(1024*1024);
426  m_runMB += static_cast<double>(sizeToDisk)/(1024*1024);
427  m_file_end_record.events_in_file++;
428  m_file_end_record.events_in_run++;
429 
430  ERS_DEBUG(3,"Event "<< m_file_end_record.events_in_run<<" is written at offset "<<m_latestPosition);
431 
432  if(!m_cFile.good()) return EventStorage::DWNOOK;
433 
434  return EventStorage::DWOK;
435 }
436 
437 
438 int64_t DataWriter::getPosition() const
439 {
440  return m_latestPosition;
441 }
442 
443 // statistics
444 unsigned int DataWriter::eventsInFile() const
445 {
446  return m_file_end_record.events_in_file;
447 }
448 
449 unsigned int DataWriter::eventsInFileSequence() const
450 {
451  return m_file_end_record.events_in_run;
452 }
453 
454 unsigned int DataWriter::dataMB_InFile() const
455 {
456  return static_cast<unsigned int>(m_cFileMB+0.5);
457 }
458 
459 unsigned int DataWriter::dataMB_InFileSequence() const
460 {
461  return static_cast<unsigned int>(m_runMB+0.5);
462 }
463 
464 // closes the current file
465 DWError DataWriter::closeFile()
466 {
467  ERS_DEBUG(3,"DataWriter::closeFile() called.");
468 
469  // do statistics
470  m_file_end_record.data_in_file = static_cast<unsigned int>(m_cFileMB+0.5);
471  m_file_end_record.data_in_run = static_cast<unsigned int>(m_runMB+0.5);
472 
473  date_timeAsInt(m_file_end_record.date,m_file_end_record.time);
474 
475  // write eof record
476  file_record(&m_file_end_record,&file_end_pattern);
477 
478  m_cFile.close();
479  std::ostringstream oss;
480  oss.width(8);
481  (void)oss.fill('0');
482  oss << std::hex << std::uppercase <<m_check;
483  std::string checksum = oss.str();
484  m_check = ::adler32(0L, Z_NULL, 0);
485 
486  // rename the file
487  ERS_DEBUG(3,"Rename file " << nameFile(UNFINISHED) << endl
488  << "to " << nameFile(FINISHED));
489  if (::rename(nameFile(UNFINISHED).c_str(), nameFile(FINISHED).c_str()) == -1) {
490 
491  EventStorage::WritingIssue ci(ERS_HERE, "Rename failed.");
492  ers::error(ci);
493  return EventStorage::DWNOOK;
494  }
495 
496  // check if the file is there
497  if(fileExists(nameFile(FINISHED)) && m_cFileOpen)
498  {
499  ERS_DEBUG(2,"Finished file "<<nameFile(FINISHED));
500  if(m_callBack != NULL) {
501  ERS_DEBUG(3,"Execute callback from DataWriter.");
502  m_callBack->FileWasClosed(
503  m_filenamecallback->getCurrentFileName(),
505  m_streamType,
506  m_streamName,
507  m_applicationName,
508  m_guid,
509  checksum,
510  m_file_end_record.events_in_file,
511  m_internal_run_parameters_record.run_number,
512  m_file_start_record.file_number,
513  m_lumiBlockNumber,
515  );
516  }
517 
518  // now we can substitute new directory, if specified
519  if(m_nextWritePath != "") {
520  m_writePath=m_nextWritePath;
521  m_nextWritePath="";
522  ERS_DEBUG(3,"New writing path became effective. The path is "
523  <<m_writePath);
524  }
525  m_cFileOpen = false;
526 
527  try{
528  m_filenamecallback->advance();
529  }catch(EventStorage::ES_SingleFile &e){
530  //If opennext file is called, it
531  // will fail there
532  }
533  return EventStorage::DWOK;
534  }
535  return EventStorage::DWNOOK;
536 }
537 
538 // closes the current file and opens another one
539 DWError DataWriter::nextFile()
540 {
541  ERS_DEBUG(2,"DataWriter::nextFile() called.");
542 
543  DWError we=closeFile();
544 
545 /* if (m_freename)
546  {
547  EventStorage::ES_SingleFile ci(ERS_HERE, "DataWriter called with freename = 1. DataWriter wants to go to next file, but cannot, since indexing is forbidden. Either deactive freename (so files can be indexed, or increase the file size limit (or turn it off)");
548  throw ci;
549  }*/
550 
551  openNextFile();
552  if(m_openFailed) we=EventStorage::DWNOOK;
553  return we;
554 }
555 
556 bool DataWriter::fileExists(const string& name) const
557 {
558  ifstream test(name.c_str(),ios::binary | ios::in);
559  bool isThere = test.good();
560  test.close();
561 
562  return isThere;
563 }
564 
565 void DataWriter::openNextFile()
566 {
567  m_cFileMB=0.0;
568  m_file_end_record.events_in_file=0;
569 
570  try{
571  m_file_start_record.file_number = m_filenamecallback->getIndex();
572  }catch(EventStorage::ES_SingleFile &e){
573  m_file_start_record.file_number++;
574  }
575  date_timeAsInt(m_file_start_record.date,m_file_start_record.time);
576 
577  ERS_DEBUG(2,"Trying to open file "<<nameFile(UNFINISHED));
578 
581  {
582 
584  string err = "found an existing file with name " + nameFile(UNFINISHED);
585  EventStorage::WritingIssue ci(ERS_HERE, err.c_str());
586  ers::warning(ci);
587 
588  } else {
589 
590  string err = "found an existing file with name " + nameFile(FINISHED);
591  EventStorage::WritingIssue ci(ERS_HERE, err.c_str());
592  ers::warning(ci);
593  }
594  m_filenamecallback->fileAlreadyExists();
595 
596  m_file_start_record.file_number = m_filenamecallback->getIndex();
597 
598  ostringstream oss;
599  oss << "increase file number to ";
600  oss << m_file_start_record.file_number;
601  EventStorage::WritingIssue ci(ERS_HERE, oss.str().c_str());
602  ers::warning(ci);
603  }
604  ERS_DEBUG(2,"OK to write file with number "<<m_file_start_record.file_number);
605 
606  ERS_DEBUG(2,"Opening file: " << nameFile(UNFINISHED));
607 
608  m_cFile.clear();
609  m_cFile.open(nameFile(UNFINISHED).c_str(),
610  ios::out | ios::app | ios::binary);
611 
612  m_check = ::adler32(0L, Z_NULL, 0);
613 
614  file_record(&m_file_start_record,&file_start_pattern);
615  file_record(m_file_name_strings);
616 
617  this->replaceGuid();
618 
619  ERS_DEBUG(3,"Writing "<<m_fmdStrings.size()<<" metadata strings.");
620  if(m_fmdStrings.size()>0) file_record(m_fmdStrings);
621  file_record(&m_internal_run_parameters_record,&run_parameters_pattern);
622  ERS_DEBUG(3,"Status of the file. good() returns "<<m_cFile.good());
623  m_cFileOpen = m_cFile.good();
624  m_openFailed = !m_cFile.good();
625 
626  if((m_callBack != NULL) && m_cFileOpen) {
627  ERS_DEBUG(3,"Execute callback from DataWriter.");
628  m_callBack->FileWasOpened(
629  m_filenamecallback->getCurrentFileName(),
631  m_streamType,
632  m_streamName,
633  m_applicationName,
634  m_guid,
635  m_internal_run_parameters_record.run_number,
636  m_file_start_record.file_number,
637  m_lumiBlockNumber
638  );
639  }
640 }
641 
642 string DataWriter::nameFile(const FileStatus& fs) const
643 {
644  ostringstream n;
645  n << m_writePath << "/";
646  n << m_filenamecallback->getCurrentFileName((FINISHED == fs)?false:true);
647  string name = n.str();
648  return name;
649 }
650 
651 void DataWriter::cd(const string& writingPath) {
652  m_nextWritePath = writingPath;
653  ERS_DEBUG(3,"Directory changed to "<<m_nextWritePath
654  <<" (effective for hext file).");
655 }
656 
657 bool DataWriter::inTransition() const {
658 
659  bool inT=false;
660  if((m_nextWritePath != "") &&
661  (m_nextWritePath != m_writePath)) inT=true;
662  return inT;
663 
664 }
665 
666 void DataWriter::file_record(void *ri, const void *pi) {
667 
668  uint32_t *record = reinterpret_cast<uint32_t *>(ri);
669  const uint32_t *pattern = reinterpret_cast<const uint32_t *>(pi);
670  int size=pattern[1];
671 
672  for(int i=0; i<size; i++) {
673  if(pattern[i] != 0) {
674  m_cFile.write(reinterpret_cast<const char*>(pattern+i),sizeof(uint32_t));
675  m_check = ::adler32(m_check,reinterpret_cast<const Bytef*>(pattern+i),sizeof(uint32_t));
676  } else {
677  m_cFile.write(reinterpret_cast<char*>(record+i),sizeof(uint32_t));
678  m_check = ::adler32(m_check,reinterpret_cast<const Bytef*>(record+i),sizeof(uint32_t));
679  }
680  }
681 }
682 
683 
684 void DataWriter::file_record(const offline_EventStorage_v5::file_name_strings& nst) {
685 
686  const char *cName = nst.appName.c_str();
687  const char *cTag = nst.fileNameCore.c_str();
688 
689  uint32_t sizeName = nst.appName.size();
690  uint32_t sizeTag = nst.fileNameCore.size();
691 
692  m_cFile.write(ccharAddress(offline_EventStorage_v5::file_name_strings_marker),sizeof(uint32_t));
693  m_check = ::adler32(m_check,reinterpret_cast<const Bytef*>
695  sizeof(uint32_t));
696 
697  m_cFile.write(charAddress(sizeName),sizeof(uint32_t));
698  m_check = ::adler32(m_check,cbytefAddress(sizeName),sizeof(uint32_t));
699  m_cFile.write(cName,sizeName);
700  m_check = ::adler32(m_check,reinterpret_cast<const Bytef*>(cName),sizeName);
701 
702  char ns = sizeName % 4;
703  if(ns){
704  m_cFile.write(" ",4-ns);
705  m_check = ::adler32(m_check,reinterpret_cast<const Bytef*>(" "),4-ns);
706  }
707 
708  m_cFile.write(charAddress(sizeTag),sizeof(uint32_t));
709  m_check = ::adler32(m_check,bytefAddress(sizeTag),sizeof(uint32_t));
710  m_cFile.write(cTag,sizeTag);
711  m_check = ::adler32(m_check,reinterpret_cast<const Bytef*>(cTag),sizeTag);
712 
713  ns = sizeTag % 4;
714  if(ns){
715  m_cFile.write(" ",4-ns);
716  m_check = ::adler32(m_check,reinterpret_cast<const Bytef*>(" "),4-ns);
717  }
718 
719 }
720 
721 void DataWriter::file_record(const offline_EventStorage_v5::freeMetaDataStrings& fmdStrings)
722 {
723  ERS_DEBUG(2,"Writing the metadata strings.");
724 
725  m_cFile.write(ccharAddress(offline_EventStorage_v5::free_strings_marker),sizeof(uint32_t));
726  m_check = ::adler32(m_check, reinterpret_cast<const Bytef*>
728  sizeof(uint32_t));
729 
730  uint32_t nstrings = fmdStrings.size();
731  m_cFile.write(charAddress(nstrings),sizeof(uint32_t));
732  m_check = ::adler32(m_check, bytefAddress(nstrings),
733  sizeof(uint32_t));
734 
735  vector<string>::const_iterator it;
736  for(it=fmdStrings.begin(); it!=fmdStrings.end(); ++it) {
737 
738  const char *cst = it->c_str();
739  uint32_t slen = it->size();
740 
741  m_cFile.write(charAddress(slen),sizeof(uint32_t));
742  m_check = ::adler32(m_check,bytefAddress(slen),sizeof(uint32_t));
743  m_cFile.write(cst,slen);
744  m_check = ::adler32(m_check,reinterpret_cast<const Bytef*>(cst),slen);
745  char ns = slen % 4;
746  if(ns){
747  m_cFile.write(" ",4-ns);
748  m_check = ::adler32(m_check,reinterpret_cast<const Bytef*>(" "),4-ns);
749  }
750  }
751 }
752 
753 void DataWriter::registerCallBack(DataWriterCallBack *pUserCBclass) {
754  m_callBack = pUserCBclass;
755  if(m_callBack != NULL) {
756  m_callBack->FileWasOpened(
757  m_filenamecallback->getCurrentFileName(),
759  m_streamType,
760  m_streamName,
761  m_applicationName,
762  m_guid,
763  m_internal_run_parameters_record.run_number,
764  m_file_start_record.file_number,
765  m_lumiBlockNumber
766  );
767  }
768 }
769 
770 void DataWriter::spaceForGuid() {
771  string e("");
772  m_fmdStrings.insert(m_fmdStrings.begin(),e);
773 }
774 
775 void DataWriter::replaceGuid() {
776  using namespace std;
777 
778  if (m_next_guid == ""){
780  m_guid = g.toString();
781  }else{
782  m_guid = m_next_guid;
783  m_next_guid = "";
784  }
785 
786  string e1="GUID=" + m_guid;
787  m_fmdStrings[0]=e1;
788 }
789 
790 void DataWriter::setGuid(const std::string& Guid){
791  m_next_guid = Guid;
792 }
793 
794 
795 uint64_t DataWriter::getFileSize(const std::string& fileNameCore) const
796 {
797  struct stat64 tmp;
798  if (::stat64(fileNameCore.c_str(), &tmp) == -1) {
799  EventStorage::WritingIssue ci(ERS_HERE, "stat64 failed.");
800  ers::error(ci);
801  return 0;
802  }
803 
804  return tmp.st_size;
805 }
806 
807 
808 offline_EventStorage_v5::CompressionType DataWriter::getCompression() const
809 {
810  return m_compression;
811 }
mergePhysValFiles.pattern
pattern
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:25
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
offline_EventStorage_v5::file_name_strings::fileNameCore
std::string fileNameCore
Definition: v5_EventStorageRecords.h:57
v5_Guid.h
dqt_zlumi_alleff_HIST.iov
iov
Definition: dqt_zlumi_alleff_HIST.py:119
offline_EventStorage_v5::FINISHED
@ FINISHED
Definition: v5_DataWriter.h:42
offline_EventStorage_v5::free_strings_marker
const uint32_t free_strings_marker
Definition: v5_EventStorageRecords.h:96
offline_EventStorage_v5::freeMetaDataStrings
std::vector< std::string > freeMetaDataStrings
Definition: v5_EventStorageRecords.h:60
offline_EventStorage_v5::run_parameters_record::max_events
uint32_t max_events
Definition: v5_EventStorageRecords.h:66
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
egammaEnergyPositionAllSamples::e1
double e1(const xAOD::CaloCluster &cluster)
return the uncorrected cluster energy in 1st sampling
offline_EventStorage_v5::FileStatus
FileStatus
Definition: v5_DataWriter.h:42
offline_EventStorage_v5::file_start_pattern
const file_start_record file_start_pattern
Definition: v5_EventStorageRecords.h:98
extractSporadic.nameFile
string nameFile
Definition: extractSporadic.py:83
skel.it
it
Definition: skel.GENtoEVGEN.py:407
offline_EventStorage_v5::run_parameters_record::run_number
uint32_t run_number
Definition: v5_EventStorageRecords.h:65
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:70
offline_EventStorage_v5::iovec_const
Definition: v5_EventStorageRecords.h:36
IDTPM::getTime
float getTime(const xAOD::TrackParticle &p)
Accessor utility function for getting the track time.
Definition: TrackParametersHelper.h:156
v5_DataBuffer.h
offline_EventStorage_v5::run_parameters_record::rec_enable
uint32_t rec_enable
Definition: v5_EventStorageRecords.h:67
TrigInDetValidation_Base.test
test
Definition: TrigInDetValidation_Base.py:142
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
offline_poolCopy_v5::Guid
Definition: v5_Guid.h:34
AthenaPoolTestWrite.stream
string stream
Definition: AthenaPoolTestWrite.py:12
python.copyTCTOutput.getFileSize
def getFileSize(pfn)
Definition: copyTCTOutput.py:13
pi
#define pi
Definition: TileMuonFitter.cxx:65
offline_EventStorage_v5::run_parameters_record::marker
uint32_t marker
Definition: v5_EventStorageRecords.h:63
Pmt::getPosition
Eigen::Vector3d getPosition(const xAOD::TrackParticle &trk)
Definition: PoorMansIpAugmenterAlg.cxx:43
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
pool::Guid
::Guid Guid
Definition: T_AthenaPoolCustCnv.h:19
offline_EventStorage_v5::file_name_strings_marker
const uint32_t file_name_strings_marker
Definition: v5_EventStorageRecords.h:95
offline_EventStorage_v5::file_name_strings
Definition: v5_EventStorageRecords.h:55
offline_EventStorage_v5::run_parameters_record::beam_energy
uint32_t beam_energy
Definition: v5_EventStorageRecords.h:71
offline_EventStorage_v5::run_parameters_pattern
const internal_run_parameters_record run_parameters_pattern
Definition: v5_EventStorageRecords.h:134
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
dqt_zlumi_pandas.err
err
Definition: dqt_zlumi_pandas.py:183
lumiFormat.i
int i
Definition: lumiFormat.py:85
offline_EventStorage_v5::DataBuffer
Definition: v5_DataBuffer.h:16
python.CaloCondTools.g
g
Definition: CaloCondTools.py:15
beamspotman.n
n
Definition: beamspotman.py:729
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
offline_EventStorage_v5::file_end_pattern
const file_end_record file_end_pattern
Definition: v5_EventStorageRecords.h:167
CreateTrfArgs.fileExists
def fileExists(fp)
Definition: CreateTrfArgs.py:4
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
offline_EventStorage_v5::file_name_strings::appName
std::string appName
Definition: v5_EventStorageRecords.h:56
offline_EventStorage_v5::UNFINISHED
@ UNFINISHED
Definition: v5_DataWriter.h:42
offline_EventStorage_v5::ZLIB
@ ZLIB
Definition: v5_EventStorageRecords.h:41
offline_EventStorage_v5
Definition: ByteStreamDataWriterV5.h:15
offline_EventStorage_v5::run_parameters_record::record_size
uint32_t record_size
Definition: v5_EventStorageRecords.h:64
WriteHiveWithMetaData.streamName
string streamName
Definition: WriteHiveWithMetaData.py:22
offline_EventStorage_v5::data_separator_record
Definition: v5_EventStorageRecords.h:74
offline_EventStorage_v5::run_parameters_record::beam_type
uint32_t beam_type
Definition: v5_EventStorageRecords.h:70
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
offline_EventStorage_v5::run_parameters_record::detector_mask
uint64_t detector_mask
Definition: v5_EventStorageRecords.h:69
PayloadHelpers::dataSize
size_t dataSize(TDA::PayloadIterator start)
Size in bytes of the buffer that is needed to decode next fragment data content.
Definition: TriggerEDMDeserialiserAlg.cxx:188
python.plotting.G4DebuggerUtils.rename
def rename(label)
Definition: G4DebuggerUtils.py:11
offline_EventStorage_v5::iovec_const::iov_len
size_t iov_len
Definition: v5_EventStorageRecords.h:38
project
T_ResultType project(ParameterMapping::type< N > parameter_map, const T_Matrix &matrix)
Definition: MeasurementSelector.h:149
offline_EventStorage_v5::data_separator_pattern
const data_separator_record data_separator_pattern
Definition: v5_EventStorageRecords.h:160
RunTileMonitoring.streamType
streamType
Definition: RunTileMonitoring.py:158
ReadBchFromCool.good
good
Definition: ReadBchFromCool.py:433
offline_EventStorage_v5::CompressionType
CompressionType
Definition: v5_EventStorageRecords.h:41
Guid
This class provides a encapsulation of a GUID/UUID/CLSID/IID data structure (128 bit number).
Definition: Guid.h:20
offline_EventStorage_v5::data_separator_record::data_block_size
uint32_t data_block_size
Definition: v5_EventStorageRecords.h:78
CaloSwCorrections.time
def time(flags, cells_name, *args, **kw)
Definition: CaloSwCorrections.py:242
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
offline_EventStorage_v5::run_parameters_record::trigger_type
uint32_t trigger_type
Definition: v5_EventStorageRecords.h:68
Herwig7_QED_EvtGen_ll.fs
dictionary fs
Definition: Herwig7_QED_EvtGen_ll.py:17
entries
double entries
Definition: listroot.cxx:49
offline_EventStorage_v5::run_parameters_record
Definition: v5_EventStorageRecords.h:62
calibdata.cd
cd
Definition: calibdata.py:50
jobOptions.fileName
fileName
Definition: jobOptions.SuperChic_ALP2.py:39
offline_EventStorage_v5::NONE
@ NONE
Definition: v5_EventStorageRecords.h:41
get_generator_info.error
error
Definition: get_generator_info.py:40
offline_EventStorage_v5::reset_record
void reset_record(void *ri, const void *pi)
Definition: v5_EventStorageRecords.cxx:56
offline_EventStorage_v5::data_separator_record::data_block_number
uint32_t data_block_number
Definition: v5_EventStorageRecords.h:77
v5_DataWriter.h
python.SystemOfUnits.ns
float ns
Definition: SystemOfUnits.py:146
python.BeamSpotUpdate.compression
compression
Definition: BeamSpotUpdate.py:188
python.SystemOfUnits.L
float L
Definition: SystemOfUnits.py:92