3 //**************************************************************************
4 //* This file is property of and copyright by the ALICE HLT Project *
5 //* ALICE Experiment at CERN, All rights reserved. *
7 //* Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
8 //* for The ALICE HLT Project. *
10 //* Permission to use, copy, modify and distribute this software and its *
11 //* documentation strictly for non-commercial purposes is hereby granted *
12 //* without fee, provided that the above copyright notice appears in all *
13 //* copies and that both the copyright notice and this permission notice *
14 //* appear in the supporting documentation. The authors make no claims *
15 //* about the suitability of this software for any purpose. It is *
16 //* provided "as is" without express or implied warranty. *
17 //**************************************************************************
19 /** @file AliHLTRootFileWriterComponent.cxx
20 @author Matthias Richter
22 @brief Base class for writer components to store data in a ROOT file
26 #include "AliHLTRootFileWriterComponent.h"
29 #include "TObjectTable.h" // for root object validity
31 /** ROOT macro for the implementation of ROOT specific class methods */
32 ClassImp(AliHLTRootFileWriterComponent)
34 AliHLTRootFileWriterComponent::AliHLTRootFileWriterComponent()
37 fEventID(kAliHLTVoidEventID),
41 // see header file for class documentation
43 // refer to README to build package
45 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
47 // all blocks of one event go into the same file
48 SetMode(kConcatenateBlocks);
51 AliHLTRootFileWriterComponent::~AliHLTRootFileWriterComponent()
53 // see header file for class documentation
56 int AliHLTRootFileWriterComponent::InitWriter()
58 // see header file for class documentation
60 // choose .root as default extension
61 if (GetExtension().IsNull()) SetExtension("root");
65 int AliHLTRootFileWriterComponent::CloseWriter()
67 // see header file for class documentation
68 if (fCurrentFile!=NULL) {
69 HLTDebug("close root file");
70 TFile* pFile=fCurrentFile; fCurrentFile=NULL;
71 pFile->Close(); delete pFile;
76 int AliHLTRootFileWriterComponent::DumpEvent( const AliHLTComponentEventData& evtData,
77 const AliHLTComponentBlockData* /*blocks*/,
78 AliHLTComponentTriggerData& /*trigData*/ )
80 // see header file for class documentation
82 if (!IsDataEvent() && !CheckMode(kWriteAllEvents)) return 0;
85 for (const TObject* pObj=GetFirstInputObject();
87 pObj=GetNextInputObject()) {
88 iResult=WriteObject(evtData.fEventID, pObj);
91 HLTDebug("wrote object of class %s, data type %s", pObj->ClassName(), (DataType2Text(GetDataType(pObj)).c_str()));
94 HLTDebug("wrote %d object(s) from %d input blocks to file", count, GetNumberOfInputBlocks());
98 int AliHLTRootFileWriterComponent::ScanArgument(int argc, const char** argv)
100 // see header file for class documentation
102 if (argc<=0) return 0;
103 TString argument=argv[0];
107 if (argument.CompareTo("-overwrite")==0) {
108 fOptions|=TObject::kOverwrite;
116 HLTError("missing parameter for argument %s", argument.Data());
123 int AliHLTRootFileWriterComponent::WriteObject(const AliHLTEventID_t eventID, const TObject *pOb)
125 // see header file for class documentation
128 HLTDebug("write object %p (%s)", pOb, pOb->GetName());
129 if (!CheckMode(kConcatenateEvents) && eventID != fEventID &&
130 fCurrentFile!=NULL && eventID!=kAliHLTVoidEventID) {
131 TFile* pFile=fCurrentFile; fCurrentFile=NULL;
132 pFile->Close(); delete pFile;
134 if (fCurrentFile==NULL) {
135 fCurrentFile=OpenFile(eventID, 0);
136 if (fCurrentFile) fEventID=eventID;
140 pOb->Write("", fOptions);
148 TFile* AliHLTRootFileWriterComponent::OpenFile(const AliHLTEventID_t eventID, const int blockID, const char* option)
150 // see header file for class documentation
152 TString filename("");
153 if ((BuildFileName(eventID, blockID, kAliHLTVoidDataType, 0, filename))>=0 && filename.IsNull()==0) {
154 pFile=new TFile(filename, option);
156 if (pFile->IsZombie()) {
159 HLTError("can not open ROOT file %s", filename.Data());
162 HLTFatal("memory allocation failed");
165 HLTError("failed to build a new file name for event %#8x", eventID);