New version of DATE event header
[u/mrichter/AliRoot.git] / SHUTTLE / TestShuttle / AliTestShuttle.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
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 $Log$
18 Revision 1.6  2006/11/06 14:22:47  jgrosseo
19 major update (Alberto)
20 o) reading of run parameters from the logbook
21 o) online offline naming conversion
22 o) standalone DCSclient package
23
24 Revision 1.5  2006/10/02 12:58:52  jgrosseo
25 Small interface change in StoreReferenceData
26
27 Revision 1.4  2006/08/08 14:19:07  jgrosseo
28 Update to shuttle classes (Alberto)
29
30 - Possibility to set the full object's path in the Preprocessor's and
31 Shuttle's  Store functions
32 - Possibility to extend the object's run validity in the same classes
33 ("startValidity" and "validityInfinite" parameters)
34 - Implementation of the StoreReferenceData function to store reference
35 data in a dedicated CDB storage.
36
37 Revision 1.3  2006/07/11 12:44:32  jgrosseo
38 adding parameters for extended validity range of data produced by preprocessor
39
40 Revision 1.2  2006/06/06 14:20:05  jgrosseo
41 o) updated test preprocessor (alberto)
42 o) added comments to example macro
43 o) test shuttle implements new interface
44
45 Revision 1.2  2006/03/07 07:52:34  hristov
46 New version (B.Yordanov)
47
48 Revision 1.3  2005/11/17 17:47:34  byordano
49 TList changed to TObjArray
50
51 Revision 1.2  2005/11/17 14:43:22  byordano
52 import to local CVS
53
54 Revision 1.1.1.1  2005/10/28 07:33:58  hristov
55 Initial import as subdirectory in AliRoot
56
57 Revision 1.1.1.1  2005/09/12 22:11:40  byordano
58 SHUTTLE package
59
60 Revision 1.2  2005/08/29 21:15:47  byordano
61 some docs added
62
63 */
64
65 //
66 // test implementation of the AliShuttleInterface, to be used for local tests of preprocessors
67 //
68 // reads files from the local disk
69 // stores to local CDB
70 // logs to the screen
71 //
72
73 #include "AliTestShuttle.h"
74 #include "AliLog.h"
75
76 #include "AliCDBManager.h"
77 #include "AliCDBStorage.h"
78 #include "AliCDBMetaData.h"
79 #include "AliCDBPath.h"
80 #include "AliCDBId.h"
81 #include "AliPreprocessor.h"
82
83 #include <TMap.h>
84 #include <TList.h>
85 #include <TObjString.h>
86 #include <TSystem.h>
87
88 ClassImp(AliTestShuttle)
89
90 TString AliTestShuttle::fgkMainCDB("local://$ALICE_ROOT/SHUTTLE/TestShuttle/TestCDB");
91 TString AliTestShuttle::fgkMainRefStorage("local://$ALICE_ROOT/SHUTTLE/TestShuttle/TestReference");
92
93 TString AliTestShuttle::fgkShuttleTempDir = gSystem->ExpandPathName("$ALICE_ROOT/SHUTTLE/TestShuttle/temp");
94 TString AliTestShuttle::fgkShuttleLogDir = gSystem->ExpandPathName("$ALICE_ROOT/SHUTTLE/TestShuttle/log");
95
96 //______________________________________________________________________________________________
97 AliTestShuttle::AliTestShuttle(Int_t run, UInt_t startTime, UInt_t endTime) :
98   fRun(run),
99   fStartTime(startTime),
100   fEndTime(endTime),
101   fInputFiles(0),
102   fRunParameters(0),
103   fPreprocessors(0),
104   fDcsAliasMap(0)
105 {
106   // constructor
107
108   fInputFiles = new TMap;
109   fRunParameters = new TMap;
110   fPreprocessors = new TObjArray;
111 }
112
113 //______________________________________________________________________________________________
114 AliTestShuttle::~AliTestShuttle()
115 {
116   // destructor
117
118   delete fInputFiles;
119   fInputFiles = 0;
120
121   delete fRunParameters;
122   fRunParameters = 0;
123
124   delete fPreprocessors;
125   fPreprocessors = 0;
126
127   delete fDcsAliasMap;
128   fDcsAliasMap = 0;
129 }
130
131 //______________________________________________________________________________________________
132 UInt_t AliTestShuttle::Store(const AliCDBPath& path, TObject* object, AliCDBMetaData* metaData,
133                                 Int_t validityStart, Bool_t validityInfinite)
134 {
135   // Stores the CDB object
136   // This function should be called at the end of the preprocessor cycle
137   //
138   // This implementation just stores it on the local disk, the full AliShuttle
139   // puts it to the Grid FileCatalog
140
141   Int_t startRun = fRun - validityStart;
142   if(startRun < 0) {
143         AliError("First valid run happens to be less than 0! Setting it to 0...");
144         startRun=0;
145   }
146
147   Int_t endRun = -1;
148   if(validityInfinite) {
149         endRun = AliCDBRunRange::Infinity();
150   } else {
151         endRun = fRun;
152   }
153
154   AliCDBId id(path, startRun, endRun);
155
156   return AliCDBManager::Instance()->GetStorage(fgkMainCDB)->Put(object, id, metaData);
157 }
158
159 //______________________________________________________________________________________________
160 UInt_t AliTestShuttle::StoreReferenceData(const AliCDBPath& path, TObject* object, AliCDBMetaData* metaData)
161 {
162   // Stores the object as reference data
163   // This function should be called at the end of the preprocessor cycle
164   //
165   // This implementation just stores it on the local disk, the full AliShuttle
166   // puts it to the Grid FileCatalog
167
168   AliCDBId id(path, fRun, fRun);
169
170   return AliCDBManager::Instance()->GetStorage(fgkMainRefStorage)->Put(object, id, metaData);
171 }
172
173 //______________________________________________________________________________________________
174 const char* AliTestShuttle::GetFile(Int_t system, const char* detector, const char* id, const char* source)
175 {
176   // This function retrieves a file from the given system (kDAQ, kDCS, kHLT) with the given file id
177   // and from the given source in the system.
178   // The function returnes the path to the local file.
179   //
180   // test implementation of GetFile
181   // takes files from the local disks, files are passen in a TMap in the constructor
182
183   TString key;
184   key.Form("%s-%s-%s", fkSystemNames[system], detector, id);
185   TPair* sourceListPair = dynamic_cast<TPair*> (fInputFiles->FindObject(key.Data()));
186   TMap* sourceList = 0;
187   if (sourceListPair)
188     sourceList = dynamic_cast<TMap*> (sourceListPair->Value());
189   if (!sourceList)
190   {
191     AliError(Form("Could not find any file in %s with id %s (%s)", fkSystemNames[system], id, key.Data()));
192     return 0;
193   }
194
195   TPair* fileNamePair = dynamic_cast<TPair*> (sourceList->FindObject(source));
196   TObjString* fileName = dynamic_cast<TObjString*> (fileNamePair->Value());
197   if (!fileName)
198   {
199     AliError(Form("Could not find files from source %s in %s with id %s",
200                         source, fkSystemNames[system], id));
201     return 0;
202   }
203
204   return fileName->GetString().Data();
205 }
206
207 //______________________________________________________________________________________________
208 TList* AliTestShuttle::GetFileSources(Int_t system, const char* detector, const char* id)
209 {
210   // Returns a list of sources in a given system that saved a file with the given id
211   //
212   // test implementation of GetFileSources
213   // takes files from the local disks, files are passen in a TMap in the constructor
214
215   TString key;
216   key.Form("%s-%s-%s", fkSystemNames[system], detector, id);
217   TPair* sourceListPair = dynamic_cast<TPair*> (fInputFiles->FindObject(key.Data()));
218   TMap* sourceList = 0;
219   if (sourceListPair)
220     sourceList = dynamic_cast<TMap*> (sourceListPair->Value());
221   if (!sourceList)
222   {
223     AliError(Form("Could not find any file in %s with id %s (%s)", fkSystemNames[system], id, key.Data()));
224     return 0;
225   }
226
227   TIterator* iter = sourceList->GetTable()->MakeIterator();
228   TObject* obj = 0;
229   TList* list = new TList;
230   while ((obj = iter->Next()))
231   {
232     TPair* pair = dynamic_cast<TPair*> (obj);
233     if (pair)
234       list->Add(pair->Key());
235   }
236
237   delete iter;
238
239   return list;
240 }
241
242 //______________________________________________________________________________________________
243 void AliTestShuttle::Log(const char* detector, const char* message)
244 {
245   // test implementation of Log
246   // just prints to the screen
247
248   AliInfo(Form("%s: %s", detector, message));
249 }
250
251 //______________________________________________________________________________________________
252 void AliTestShuttle::AddInputFile(Int_t system, const char* detector, const char* id, const char* source, const char* fileName)
253 {
254   // This function adds a file to the list of input files
255
256   TString key;
257   key.Form("%s-%s-%s", fkSystemNames[system], detector, id);
258   TPair* sourceListPair = dynamic_cast<TPair*> (fInputFiles->FindObject(key.Data()));
259   TMap* sourceList = 0;
260   if (sourceListPair)
261     sourceList = dynamic_cast<TMap*> (sourceListPair->Value());
262   if (!sourceList)
263   {
264     sourceList = new TMap;
265     fInputFiles->Add(new TObjString(key), sourceList);
266   }
267
268   sourceList->Add(new TObjString(source), new TObjString(fileName));
269 }
270
271 //______________________________________________________________________________________________
272 void AliTestShuttle::Process()
273 {
274   // This function tests all preprocessors that are registered to it
275   // All preprocessors get the same dcs alias map and have access to the same list of files.
276
277   for (Int_t i=0; i<fPreprocessors->GetEntries(); ++i)
278   {
279     AliPreprocessor* preprocessor = dynamic_cast<AliPreprocessor*> (fPreprocessors->At(i));
280     if (preprocessor)
281     {
282       preprocessor->Initialize(fRun, fStartTime, fEndTime);
283       preprocessor->Process(fDcsAliasMap);
284     }
285   }
286 }
287
288 //______________________________________________________________________________________________
289 void AliTestShuttle::RegisterPreprocessor(AliPreprocessor* preprocessor)
290 {
291   // registers a preprocessor
292
293         const char* detName = preprocessor->GetName();
294         if(strcmp("DET", detName) != 0) {
295                 if(GetDetPos(detName) < 0)
296                         AliFatal(Form("********** !!!!! Invalid detector name: %s !!!!! **********", detName));
297                 }
298
299         fPreprocessors->Add(preprocessor);
300 }
301
302 //______________________________________________________________________________________________
303 void AliTestShuttle::AddInputRunParameter(const char* key, const char* value){
304 // set a run parameter (in reality it will be read from the DAQ logbook)
305
306         TObjString* keyObj = new TObjString(key);
307         if (fRunParameters->Contains(key)) {
308                 AliWarning(Form("Parameter %s already existing and it will be replaced.", key));
309                 delete fRunParameters->Remove(keyObj);
310
311         }
312         fRunParameters->Add(keyObj, new TObjString(value));
313         AliDebug(2, Form("Number of parameters: %d", fRunParameters->
314         GetEntries()));
315 }
316
317 //______________________________________________________________________________________________
318 const char* AliTestShuttle::GetRunParameter(const char* key){
319 // get a run parameter
320
321         TObjString* value = dynamic_cast<TObjString*> (fRunParameters->GetValue(key));
322         if(!value) {
323                 AliError(Form("No such parameter: %s", key));
324                 return 0;
325         }
326         return value->GetName();
327 }
328
329 //______________________________________________________________________________________________
330 void AliTestShuttle::SetShuttleTempDir(const char* tmpDir)
331 {
332 // sets Shuttle temp directory
333
334         fgkShuttleTempDir = gSystem->ExpandPathName(tmpDir);
335 }
336
337 //______________________________________________________________________________________________
338 void AliTestShuttle::SetShuttleLogDir(const char* logDir)
339 {
340 // sets Shuttle log directory
341
342         fgkShuttleLogDir = gSystem->ExpandPathName(logDir);
343 }
344