Classes for online creation of root trees
[u/mrichter/AliRoot.git] / HLT / PHOS / AliHLTPHOSRcuTreeMakerComponent.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 "AliHLTPHOSRcuTreeMakerComponent.h"
19 #include "AliHLTPHOSRcuTreeMaker.h"
20 #include "AliHLTPHOSRcuProcessor.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 AliHLTPHOSRcuTreeMakerComponent::fgkInputDataTypes[]={kAliHLTVoidDataType,{0,"",""}};
31
32 AliHLTPHOSRcuTreeMakerComponent gAliHLTPHOSRcuTreeMakerComponent;
33
34 AliHLTPHOSRcuTreeMakerComponent::AliHLTPHOSRcuTreeMakerComponent() :
35   AliHLTPHOSRcuProcessor(),
36   fDigitTreePtr(0),
37   fEventCount(0),
38   fWriteInterval(1000)
39 {
40 }
41
42 AliHLTPHOSRcuTreeMakerComponent::~AliHLTPHOSRcuTreeMakerComponent()
43 {
44 }
45
46 int 
47 AliHLTPHOSRcuTreeMakerComponent::Deinit()
48 {
49
50   //  cout << "Printing file...";
51
52   /*
53   char filename [50];
54   sprintf(filename, "%s/run%d_digitTree_rcuX_%d_rcuZ_%d_%d.root", fDirectory, fRunNb,(fEventCount/fWriteInterval));
55   TFile *outfile = new TFile(filename,"recreate");
56   fDigitTreePtr->Write();
57   delete outfile;
58   outfile = 0;
59   cout << "Done!\n";
60   */
61   
62   Write();
63
64
65   if(fDigitTreePtr) 
66     {
67       delete fDigitTreePtr;
68       fDigitTreePtr = 0;
69     }
70   return 0;
71 }
72
73
74
75 const char*
76 AliHLTPHOSRcuTreeMakerComponent::GetComponentID()
77 {
78   return "PhosRcuTreeMaker";
79 }
80
81 void
82 AliHLTPHOSRcuTreeMakerComponent::GetInputDataTypes(vector<AliHLTComponentDataType>& list)
83
84  //Get datatypes for input
85   const AliHLTComponentDataType* pType=fgkInputDataTypes;
86   while (pType->fID!=0) {
87     list.push_back(*pType); 
88     pType++;
89   }
90 }
91
92 AliHLTComponentDataType 
93 AliHLTPHOSRcuTreeMakerComponent::GetOutputDataType()
94 {
95   return AliHLTPHOSDefinitions::fgkAliHLTRootTreeDataType;
96 }
97
98 void 
99 AliHLTPHOSRcuTreeMakerComponent::GetOutputDataSize(unsigned long& constBase, double& inputMultiplier)
100 {
101   constBase = 30;
102   inputMultiplier = 1;
103 }
104
105 int 
106 AliHLTPHOSRcuTreeMakerComponent::DoEvent(const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks,
107                                         AliHLTComponentTriggerData& /*trigData*/, AliHLTUInt8_t* outputPtr, AliHLTUInt32_t& size,
108                                         std::vector<AliHLTComponentBlockData>& outputBlocks)
109
110 {
111   //Do event
112
113   Bool_t digitEvent;
114   Int_t nDigits = 0;
115   Int_t totalDigits = 0;
116
117   const AliHLTComponentBlockData* iter = 0;
118   unsigned long ndx;
119
120   for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
121     {
122       iter = blocks + ndx;
123
124       if ( iter->fDataType == AliHLTPHOSDefinitions::fgkAliHLTDigitDataType )
125
126         {
127           digitEvent == true;
128           nDigits  = fTreeMakerPtr->MakeDigitArray ( reinterpret_cast<AliHLTPHOSRcuDigitContainerDataStruct*> ( iter->fPtr ), totalDigits );
129           totalDigits += nDigits;
130           //cout << totalDigits << endl;
131           continue;
132         }
133       if ( iter->fDataType == AliHLTPHOSDefinitions::fgkAliHLTClusterDataType )
134         {
135           //
136         }
137     }
138   fEventCount++;
139   fTreeMakerPtr->FillDigitTree();
140   
141   if(fEventCount%fWriteInterval == 0)
142     {
143       Write();
144       ResetTrees();
145     }
146
147 return 0;
148
149 }
150
151 int
152 AliHLTPHOSRcuTreeMakerComponent::DoInit ( int argc, const char** argv )
153 {
154
155   fTreeMakerPtr = new AliHLTPHOSRcuTreeMaker();
156   fDigitTreePtr = new TTree ( "digitTree", "Digits tree" );
157   fDirectory = new char[50];
158
159   for ( int i = 0; i < argc; i++ )
160     {
161       if ( !strcmp ( "-path", argv[i] ) )
162         {
163           strcpy ( fDirectory, argv[i+1] );
164         }
165       if ( !strcmp ( "-writeinterval", argv[i] ) )
166         {
167           fWriteInterval = atoi(argv[i+1]);
168         }
169     }
170
171   fTreeMakerPtr->SetDigitTree(fDigitTreePtr);
172     
173   fstream runNbFile;
174   Int_t newRunNb;
175   runNbFile.open("/opt/HLT-public/rundir/runNumber.txt");
176   runNbFile >> fRunNb;
177   runNbFile.close();
178   /*  newRunNb = fRunNb + 1;
179   runNbFile.open("/opt/HLT-public/rundir/runNumber.txt");
180   runNbFile << newRunNb;
181   runNbFile.close();*/
182   
183   cout << endl << "Run number is: " << fRunNb  << "  -- Check that this is correct!!!\n";
184
185   return 0;
186   
187 }
188
189
190 AliHLTComponent*
191 AliHLTPHOSRcuTreeMakerComponent::Spawn()
192 {
193   return new AliHLTPHOSRcuTreeMakerComponent();
194 }
195
196 void
197 AliHLTPHOSRcuTreeMakerComponent::Write()
198 {
199   cout << "Writing file...";
200
201   char filename [256];
202   sprintf(filename, "%s/run%d_%d_digitTree_mod%d_rcuX%d_rcuZ%d_.root", fDirectory, fRunNb,(fEventCount/fWriteInterval - 1), fModuleID, fRcuX, fRcuZ);
203   TFile *outfile = new TFile(filename,"recreate");
204   fDigitTreePtr->Write();
205   delete outfile;
206   outfile = 0;
207   cout << "Done!\n";
208
209 }
210
211 void
212 AliHLTPHOSRcuTreeMakerComponent::ResetTrees()
213 {
214   delete fDigitTreePtr;
215   fDigitTreePtr = new TTree("digitTree", "Digits tree");
216   fTreeMakerPtr->SetDigitTree(fDigitTreePtr);
217 }
218   
219   
220   
221   
222   
223   
224   
225
226
227