BlockFilter component added; minor corrections
[u/mrichter/AliRoot.git] / HLT / BASE / util / AliHLTRootFileWriterComponent.cxx
1 // @(#) $Id$
2
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
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 */
31 AliHLTRootFileWriterComponent gAliHLTRootFileWriterComponent;
32
33 /** ROOT macro for the implementation of ROOT specific class methods */
34 ClassImp(AliHLTRootFileWriterComponent)
35
36 AliHLTRootFileWriterComponent::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
52 AliHLTRootFileWriterComponent::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
62 AliHLTRootFileWriterComponent& AliHLTRootFileWriterComponent::operator=(const AliHLTRootFileWriterComponent&)
63 {
64   // see header file for class documentation
65   HLTFatal("assignment operator untested");
66   return *this;
67 }
68
69 AliHLTRootFileWriterComponent::~AliHLTRootFileWriterComponent()
70 {
71   // see header file for class documentation
72 }
73
74 int 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   }
82   return 0;
83 }
84
85 int 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 == 0) {
100       count++;
101       HLTDebug("wrote object of class %s, data type %s", pObj->ClassName(), (DataType2Text(GetDataType(pObj)).c_str())); 
102     }
103     pObj=GetNextInputObject();
104   }
105   HLTDebug("wrote %d object(s) from %d input blocks to file", count, GetNumberOfInputBlocks());
106   return iResult;
107 }
108
109 int 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   }
116   int iResult=-EINVAL;
117   return iResult;
118 }
119
120 int 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
145 TFile* 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("");
150   if ((BuildFileName(eventID, blockID, kAliHLTVoidDataType, 0, filename))>=0 && filename.IsNull()==0) {
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 }