#ifndef OUTPUTEVENTFILE #define OUTPUTEVENTFILE #include "EventFile.hh" #include "km3net-dataformat/offline/Evt.hh" #include "km3net-dataformat/offline/io_ascii.hh" #include "km3net-dataformat/offline/io_online.hh" #include "km3net-dataformat/definitions/root.hh" #include "TFile.h" #include "TTree.h" /* An output file writing offline Events, header and meta-data */ struct OutputEventFile : public TObject { Evt evt; //!< The Event that gets put into the file TFile *output_file; //!< output file TTree *output_tree; //!< output tree /* Open an output file */ OutputEventFile(string filename ) { bool ok = open(filename); if (!ok) fatal("failed to open outputfile", filename ); } /*! Open an output file, with an aanet Evt TTree */ bool open(string output_filename, bool change_dir = false) { TDirectory *d = gDirectory; output_file = new TFile(output_filename.c_str(), "RECREATE"); if (!output_file) return false; output_tree = new TTree(TTREE_OFFLINE_EVENT, "Evt Tree"); if (!output_tree) return false; output_tree->Branch(TBRANCH_OFFLINE_EVENT, &evt, BASKET_SIZE_OFFLINE_EVENT ,SPLIT_LEVEL_OFFLINE_EVENT); if (!change_dir) d->cd(); // cd to orinal directory return true; } /*! Write the event to the output TTree. */ int write(const Evt &evt_to_write) { evt = evt_to_write; return output_tree->Fill(); } /* Write header object to file */ void write_header(const Head &header) { output_file->WriteObject(&header, "Head"); } /*! write the 'meta data' to the output file */ void write_meta_data(const vector& meta_data ) { output_file->mkdir("META"); TDirectory *d = (TDirectory *)output_file->Get("META"); for (auto i : meta_data) { d->WriteTObject(i, i->GetName()); } } bool copy_summary_data( EventFile& f ) { if ( !f.rootfile()) return false; prepare_summary_frame( f.rootfile() ); TTree* t = (TTree*) f.rootfile()->Get( TTREE_ONLINE_SUMMARYSLICE ); if ( !t ) return false; output_file->cd(); t->CloneTree()->Write(); return true; } void close() { if (!output_file) return; // file is already closed. output_file->cd(); output_file->Write("", TObject::kOverwrite); output_file->Close(); delete output_file; output_tree = 0; output_file = 0; } ~OutputEventFile() { close(); } ClassDef(OutputEventFile, 1) }; #endif