enhanced functionality (sub dirs, file name format specifiers)
[u/mrichter/AliRoot.git] / HLT / BASE / util / AliHLTRootFileWriterComponent.cxx
CommitLineData
4ddfc222 1// @(#) $Id$
2
9be2600f 3/**************************************************************************
4 * This file is property of and copyright by the ALICE HLT Project *
5 * ALICE Experiment at CERN, All rights reserved. *
6 * *
7 * Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
8 * for The ALICE HLT Project. *
9 * *
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 **************************************************************************/
18
4ddfc222 19/** @file AliHLTRootFileWriterComponent.cxx
20 @author Matthias Richter
21 @date
22 @brief Base class for writer components to store data in a ROOT file
23
24 */
25
26#include "AliHLTRootFileWriterComponent.h"
27#include "TFile.h"
28#include "TString.h"
29
30/** the global object for component registration */
31AliHLTRootFileWriterComponent gAliHLTRootFileWriterComponent;
32
33/** ROOT macro for the implementation of ROOT specific class methods */
34ClassImp(AliHLTRootFileWriterComponent)
35
36AliHLTRootFileWriterComponent::AliHLTRootFileWriterComponent()
37 :
38 AliHLTFileWriter(),
39 fEventID(kAliHLTVoidEventID),
40 fCurrentFile(NULL)
41{
42 // see header file for class documentation
43 // or
44 // refer to README to build package
45 // or
46 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
47
48 // all blocks of one event go into the same file
49 SetMode(kConcatenateBlocks);
50}
51
52AliHLTRootFileWriterComponent::AliHLTRootFileWriterComponent(const AliHLTRootFileWriterComponent&)
53 :
54 AliHLTFileWriter(),
55 fEventID(kAliHLTVoidEventID),
56 fCurrentFile(NULL)
57{
58 // see header file for class documentation
59 HLTFatal("copy constructor untested");
60}
61
62AliHLTRootFileWriterComponent& AliHLTRootFileWriterComponent::operator=(const AliHLTRootFileWriterComponent&)
63{
64 // see header file for class documentation
65 HLTFatal("assignment operator untested");
66 return *this;
67}
68
69AliHLTRootFileWriterComponent::~AliHLTRootFileWriterComponent()
70{
71 // see header file for class documentation
72}
73
79c114b5 74int AliHLTRootFileWriterComponent::CloseWriter()
75{
76 // see header file for class documentation
77 if (fCurrentFile!=NULL) {
78 HLTDebug("close root file");
79 TFile* pFile=fCurrentFile; fCurrentFile=NULL;
80 pFile->Close(); delete pFile;
81 }
e83e889b 82 return 0;
79c114b5 83}
84
4ddfc222 85int AliHLTRootFileWriterComponent::DumpEvent( const AliHLTComponentEventData& evtData,
86 const AliHLTComponentBlockData* blocks,
87 AliHLTComponentTriggerData& trigData )
88{
89 // see header file for class documentation
90 int iResult=0;
91 if (evtData.fStructSize==0 && blocks==NULL && trigData.fStructSize==0) {
92 // this is just to get rid of the warning "unused parameter"
93 }
94 const TObject* pObj=GetFirstInputObject(kAliHLTAnyDataType);
95 HLTDebug("got first object %p", pObj);
96 int count=0;
97 while (pObj && iResult>=0) {
98 iResult=WriteObject(evtData.fEventID, pObj);
99 if (iResult) {
100 count++;
101 HLTDebug("wrote object of class %s, data type %s", pObj->ClassName(), (DataType2Text(GetDataType(pObj)).c_str()));
102 }
103 pObj=GetNextInputObject();
104 }
79c114b5 105 HLTDebug("wrote %d object(s) from %d input blocks to file", count, GetNumberOfInputBlocks());
4ddfc222 106 return iResult;
107}
108
109int AliHLTRootFileWriterComponent::ScanArgument(int argc, const char** argv)
110{
111 // see header file for class documentation
112 // no other arguments known
113 if (argc==0 && argv==NULL) {
114 // this is just to get rid of the warning "unused parameter"
115 }
96bda103 116 int iResult=-EINVAL;
4ddfc222 117 return iResult;
118}
119
120int AliHLTRootFileWriterComponent::WriteObject(const AliHLTEventID_t eventID, const TObject *pOb)
121{
122 // see header file for class documentation
123 int iResult=0;
124 if (pOb) {
125 HLTDebug("write object %p (%s)", pOb, pOb->GetName());
126 if (CheckMode(kConcatenateEvents) && eventID != fEventID &&
127 fCurrentFile!=NULL && eventID!=kAliHLTVoidEventID) {
128 TFile* pFile=fCurrentFile; fCurrentFile=NULL;
129 pFile->Close(); delete pFile;
130 }
131 if (fCurrentFile==NULL) {
132 fCurrentFile=OpenFile(eventID, 0);
133 if (fCurrentFile) fEventID=eventID;
134 }
135 if (fCurrentFile) {
136 fCurrentFile->cd();
137 pOb->Write();
138 } else {
139 iResult=-EBADF;
140 }
141 }
142 return iResult;
143}
144
145TFile* AliHLTRootFileWriterComponent::OpenFile(const AliHLTEventID_t eventID, const int blockID, const char* option)
146{
147 // see header file for class documentation
148 TFile* pFile=NULL;
149 TString filename("");
5ab95e9a 150 if ((BuildFileName(eventID, blockID, kAliHLTVoidDataType, 0, filename))>=0 && filename.IsNull()==0) {
4ddfc222 151 pFile=new TFile(filename, option);
152 if (pFile) {
153 if (pFile->IsZombie()) {
154 delete pFile;
155 pFile=NULL;
156 HLTError("can not open ROOT file %s", filename.Data());
157 }
158 } else {
159 HLTFatal("memory allocation failed");
160 }
161 } else {
162 HLTError("failed to build a new file name for event %#8x", eventID);
163 }
164 return pFile;
165}