00001 // $Id: EventOutputService.cc,v 1.3 2008/10/24 17:41:55 loizides Exp $ 00002 00003 #include <EventFilter/StorageManager/interface/EventOutputService.h> 00004 #include <IOPool/Streamer/interface/EventMessage.h> 00005 00006 #include <iostream> 00007 00008 using namespace edm; 00009 using namespace std; 00010 using boost::shared_ptr; 00011 00012 00013 // 00014 // *** EventOutputService 00015 // 00016 EventOutputService::EventOutputService(boost::shared_ptr<FileRecord> file, 00017 InitMsgView const& view) 00018 { 00019 file_ = file; 00020 00021 string streamerFileName = file_ -> filePath() + file_ -> fileName() + file_ -> fileCounterStr() + ".dat"; 00022 string indexFileName = file_ -> filePath() + file_ -> fileName() + file_ -> fileCounterStr() + ".ind"; 00023 00024 writer_ = shared_ptr<StreamerFileWriter> (new StreamerFileWriter(streamerFileName, indexFileName)); 00025 writeHeader(view); 00026 00027 file_ -> firstEntry(getTimeStamp()); 00028 file_ -> insertFileInDatabase(); 00029 } 00030 00031 00032 // 00033 // *** call close file 00034 // 00035 EventOutputService::~EventOutputService() 00036 { 00037 //std::cout << "EventOutputService Destructor called." << std::endl; 00038 closeFile(); 00039 } 00040 00041 00042 // 00043 // *** write file header 00044 // *** write increase file size by file header size 00045 // 00046 void EventOutputService::writeHeader(InitMsgView const& view) 00047 { 00048 writer_ -> doOutputHeader(view); 00049 file_ -> increaseFileSize(view.size()); 00050 } 00051 00052 00053 // 00054 // *** write event to file 00055 // *** increase the file size 00056 // *** update time of last entry 00057 // *** increase event count 00058 // 00059 void EventOutputService::writeEvent(const uint8 * const bufPtr) 00060 { 00061 EventMsgView view((void *) bufPtr); 00062 writer_ -> doOutputEvent(view); 00063 file_ -> increaseFileSize(view.size()); 00064 file_ -> lastEntry(getTimeStamp()); 00065 file_ -> increaseEventCount(); 00066 } 00067 00068 00069 // 00070 // *** stop file write 00071 // *** add end of file record size to file size 00072 // *** move file to "closed" directory 00073 // *** write to summary catalog 00074 // *** write to mail box 00075 // 00076 void EventOutputService::closeFile() 00077 { 00078 writer_ -> stop(); 00079 file_ -> increaseFileSize(writer_->getStreamEOFSize()); 00080 file_ -> setadler(writer_->get_adler32_stream(),writer_->get_adler32_index()); 00081 file_ -> moveFileToClosed(); 00082 file_ -> writeToSummaryCatalog(); 00083 file_ -> updateDatabase(); 00084 } 00085 00086 00087 // 00088 // *** report status of OutputService 00089 // 00090 void EventOutputService::report(ostream &os, int indentation) const 00091 { 00092 string prefix(indentation, ' '); 00093 os << prefix << "------------- EventOutputService -------------\n"; 00094 file_ -> report(os,indentation); 00095 double time = (double) file_ -> lastEntry() - (double) file_ -> firstEntry(); 00096 double rate = (time>0) ? (double) file_ -> events() / (double) time : 0.; 00097 double tput = (time>0) ? (double) file_ -> fileSize() / ((double) time * 1048576.) : 0.; 00098 os << prefix << "rate " << rate << " evts/s\n"; 00099 os << prefix << "throughput " << tput << " MB/s\n"; 00100 os << prefix << "time " << time << " s\n"; 00101 os << prefix << "-----------------------------------------\n"; 00102 }