Classes for online creation of root trees
[u/mrichter/AliRoot.git] / HLT / PHOS / AliHLTPHOSTreeMakerComponent.cxx
1 /**************************************************************************
2  * This file is property of and copyright by the ALICE HLT Project        * 
3  * All rights reserved.                                                   *
4  *                                                                        *
5  * Primary Authors: Oystein Djuvsland                                     *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          * 
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16
17  
18 #include "AliHLTPHOSTreeMakerComponent.h"
19 #include "AliHLTPHOSTreeMaker.h"
20 #include "AliHLTPHOSProcessor.h"
21 #include "AliHLTPHOSDigitDataStruct.h"
22 #include "TTree.h"
23 #include "TClonesArray.h"
24 #include "TObject.h"
25 #include <fstream>
26 #include "TFile.h"
27 #include <sys/stat.h>
28 #include <sys/types.h>
29
30 const AliHLTComponentDataType AliHLTPHOSTreeMakerComponent::fgkInputDataTypes[]={kAliHLTVoidDataType,{0,"",""}};
31
32 AliHLTPHOSTreeMakerComponent gAliHLTPHOSTreeMakerComponent;
33
34 AliHLTPHOSTreeMakerComponent::AliHLTPHOSTreeMakerComponent() :
35   AliHLTPHOSProcessor(),
36   fDigitTreePtr(0),
37   fEventCount(0),
38   fWriteInterval(1000)
39 {
40 }
41
42 AliHLTPHOSTreeMakerComponent::~AliHLTPHOSTreeMakerComponent()
43 {
44 }
45
46 int 
47 AliHLTPHOSTreeMakerComponent::Deinit()
48 {
49   cout << "Printing file...";
50   char filename [50];
51   sprintf(filename, "%s/run%d_digitTree_%d.root", fDirectory, fRunNb,(fEventCount/fWriteInterval));
52   TFile *outfile = new TFile(filename,"recreate");
53   fDigitTreePtr->Write();
54   delete outfile;
55   outfile = 0;
56   cout << "Done!\n";
57   if(fDigitTreePtr) 
58     {
59       delete fDigitTreePtr;
60       fDigitTreePtr = 0;
61     }
62   return 0;
63 }
64
65
66
67 const char*
68 AliHLTPHOSTreeMakerComponent::GetComponentID()
69 {
70   return "PhosTreeMaker";
71 }
72
73 void
74 AliHLTPHOSTreeMakerComponent::GetInputDataTypes(vector<AliHLTComponentDataType>& list)
75
76  //Get datatypes for input
77   const AliHLTComponentDataType* pType=fgkInputDataTypes;
78   while (pType->fID!=0) {
79     list.push_back(*pType); 
80     pType++;
81   }
82 }
83
84 AliHLTComponentDataType 
85 AliHLTPHOSTreeMakerComponent::GetOutputDataType()
86 {
87   return AliHLTPHOSDefinitions::fgkAliHLTRootTreeDataType;
88 }
89
90 void 
91 AliHLTPHOSTreeMakerComponent::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier)
92 {
93   constBase = 30;
94   inputMultiplier = 1;
95 }
96
97 int 
98 AliHLTPHOSTreeMakerComponent::DoEvent(const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks,
99                                         AliHLTComponentTriggerData& /*trigData*/, AliHLTUInt8_t* outputPtr, AliHLTUInt32_t& size,
100                                         std::vector<AliHLTComponentBlockData>& outputBlocks)
101
102 {
103   //Do event
104
105   Bool_t digitEvent;
106   Int_t nDigits = 0;
107   Int_t totalDigits = 0;
108
109   const AliHLTComponentBlockData* iter = 0;
110   unsigned long ndx;
111
112   for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
113     {
114       iter = blocks + ndx;
115
116       if ( iter->fDataType == AliHLTPHOSDefinitions::fgkAliHLTDigitDataType )
117
118         {
119           digitEvent == true;
120           nDigits  = fTreeMakerPtr->MakeDigitArray ( reinterpret_cast<AliHLTPHOSDigitContainerDataStruct*> ( iter->fPtr ), totalDigits );
121           totalDigits += nDigits;
122           //cout << totalDigits << endl;
123           continue;
124         }
125       if ( iter->fDataType == AliHLTPHOSDefinitions::fgkAliHLTClusterDataType )
126         {
127           //
128         }
129     }
130   fEventCount++;
131   fTreeMakerPtr->FillDigitTree();
132   
133   if(fEventCount%fWriteInterval == 0)
134     {
135       Write();
136       ResetTrees();
137     }
138
139 return 0;
140
141 }
142
143 int
144 AliHLTPHOSTreeMakerComponent::DoInit ( int argc, const char** argv )
145 {
146
147   fTreeMakerPtr = new AliHLTPHOSTreeMaker();
148   fDigitTreePtr = new TTree ( "digitTree", "Digits tree" );
149   fDirectory = new char[50];
150
151   for ( int i = 0; i < argc; i++ )
152     {
153       if ( !strcmp ( "-path", argv[i] ) )
154         {
155           strcpy ( fDirectory, argv[i+1] );
156         }
157       if ( !strcmp ( "-writeinterval", argv[i] ) )
158         {
159           fWriteInterval = atoi(argv[i+1]);
160         }
161     }
162
163   fTreeMakerPtr->SetDigitTree(fDigitTreePtr);
164     
165   fstream runNbFile;
166   Int_t newRunNb;
167   runNbFile.open("/opt/HLT-public/rundir/runNumber.txt");
168   runNbFile >> fRunNb;
169   runNbFile.close();
170   /*  newRunNb = fRunNb + 1;
171   runNbFile.open("/opt/HLT-public/rundir/runNumber.txt");
172   runNbFile << newRunNb;
173   runNbFile.close();*/
174   
175   cout << endl << "Run number is: " << fRunNb  << "  -- Check that this is correct!!!\n";
176
177   return 0;
178   
179 }
180
181
182 AliHLTComponent*
183 AliHLTPHOSTreeMakerComponent::Spawn()
184 {
185   return new AliHLTPHOSTreeMakerComponent();
186 }
187
188 void
189 AliHLTPHOSTreeMakerComponent::Write()
190 {
191   cout << "Writing file...";
192   char filename [50];
193   sprintf(filename, "%s/run%d_digitTree_%d.root", fDirectory, fRunNb,(fEventCount/fWriteInterval - 1));
194   TFile *outfile = new TFile(filename,"recreate");
195   fDigitTreePtr->Write();
196   delete outfile;
197   outfile = 0;
198   cout << "Done!\n";
199 }
200
201 void
202 AliHLTPHOSTreeMakerComponent::ResetTrees()
203 {
204   delete fDigitTreePtr;
205   fDigitTreePtr = new TTree("digitTree", "Digits tree");
206   fTreeMakerPtr->SetDigitTree(fDigitTreePtr);
207 }
208   
209   
210   
211   
212   
213   
214   
215
216
217