Added methods for finding a given module in the DDL map (F. Prino)
[u/mrichter/AliRoot.git] / STEER / AliPreprocessor.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.17  2007/08/28 16:03:30  acolla
19 Restored to v1.14:
20
21
22 Function Bool_t GetHLTStatus() added to preprocessor interface. It will return
23 the status of HLT read from the run logbook.
24
25 Revision 1.16  2007/08/22 09:20:50  hristov
26 Updated QA classes (Yves)
27
28 Revision 1.14  2007/05/30 06:35:21  jgrosseo
29 Adding functionality to the Shuttle/TestShuttle:
30 o) Function to retrieve list of sources from a given system (GetFileSources with id=0)
31 o) Function to retrieve list of IDs for a given source      (GetFileIDs)
32 These functions are needed for dealing with the tag files that are saved for the GRP preprocessor
33 Example code has been added to the TestProcessor in TestShuttle
34
35 Revision 1.13  2007/04/12 08:26:33  jgrosseo
36 updated commment
37
38 Revision 1.12  2007/04/05 08:05:55  acolla
39 Conversion from online to offline detector name in StoreReferenceFile
40
41 Revision 1.11  2007/04/04 10:29:18  jgrosseo
42 1) Storing of files to the Grid is now done _after_ your preprocessors succeeded. This is transparent, which means that you can still use the same functions (Store, StoreReferenceData) to store files to the Grid. However, the Shuttle first stores them locally and transfers them after the preprocessor finished. The return code of these two functions has changed from UInt_t to Bool_t which gives you the success of the storing.
43 In case of an error with the Grid, the Shuttle will retry the storing later, the preprocessor does not need to be run again.
44
45 2) The meaning of the return code of the preprocessor has changed. 0 is now success and any other value means failure. This value is stored in the log and you can use it to keep details about the error condition.
46
47 3) New function StoreReferenceFile to _directly_ store a file (without opening it) to the reference storage.
48
49 4) The memory usage of the preprocessor is monitored. If it exceeds 2 GB it is terminated.
50
51 5) New function AliPreprocessor::ProcessDCS(). If you do not need to have DCS data in all cases, you can skip the processing by implemting this function and returning kFALSE under certain conditions. E.g. if there is a certain run type.
52 If you always need DCS data (like before), you do not need to implement it.
53
54 6) The run type has been added to the monitoring page
55
56 Revision 1.9  2007/02/28 10:42:58  acolla
57 Run type field added in SHUTTLE framework. Run type is read from "run type" logbook and retrieved by
58 AliPreprocessor::GetRunType() function.
59
60 Revision 1.7  2006/11/06 14:24:21  jgrosseo
61 reading of run parameters from the logbook
62 online offline naming conversion
63
64 Revision 1.6  2006/10/02 12:57:48  jgrosseo
65 Small interface change of function StoreReferenceData in Shuttle
66
67 Revision 1.5  2006/09/04 17:42:34  hristov
68 Changes required by Effective C++
69
70 Revision 1.4  2006/08/08 14:20:49  jgrosseo
71 Update to shuttle classes (Alberto)
72
73 - Possibility to set the full object's path in the Preprocessor's and
74 Shuttle's  Store functions
75 - Possibility to extend the object's run validity in the same classes
76 ("startValidity" and "validityInfinite" parameters)
77 - Implementation of the StoreReferenceData function to store reference
78 data in a dedicated CDB storage.
79
80 Revision 1.3  2006/07/11 12:42:43  jgrosseo
81 adding parameters for extended validity range of data produced by preprocessor
82
83 Revision 1.2  2006/06/06 16:36:49  jgrosseo
84 minor changes in AliShuttleInterface and AliPreprocessor
85
86 Revision 1.1  2006/06/02 14:14:36  hristov
87 Separate library for CDB (Jan)
88
89 Revision 1.2  2006/03/07 07:52:34  hristov
90 New version (B.Yordanov)
91
92 Revision 1.3  2005/11/17 17:47:34  byordano
93 TList changed to TObjArray
94
95 Revision 1.2  2005/11/17 14:43:22  byordano
96 import to local CVS
97
98 Revision 1.1.1.1  2005/10/28 07:33:58  hristov
99 Initial import as subdirectory in AliRoot
100
101 Revision 1.1.1.1  2005/09/12 22:11:40  byordano
102 SHUTTLE package
103
104 Revision 1.2  2005/08/29 21:15:47  byordano
105 some docs added
106
107 */
108
109 // Description:
110 // This class is the CDBPreProcessor interface,
111 // supposed to be implemented by any detector
112 // interested in immediate processing of data 
113 // which is retrieved from DCS.
114 // For every particular run set of aliases and
115 // their corespoding value sets are returned.
116 // Usage schema:
117 //      1) virtual void Initialize(Int_t run, UInt_t startTime, UInt_t endTime) 
118 //      This method is called at the begining of data retrieval.
119 //      run: run number
120 //      startTime: when the run started
121 //      endTime: when the run finished  
122 //
123 //      2) virtual void Process()
124 //
125 //      This method is called and passed a list of retrieved values from DCS
126 //
127 //
128
129
130 #include "AliPreprocessor.h"
131
132 #include <TString.h>
133 #include <TMap.h>
134 #include <TObjString.h>
135
136 #include "AliLog.h"
137 #include "AliCDBMetaData.h"
138 #include "AliCDBStorage.h"
139 #include "AliCDBId.h"
140 #include "AliCDBPath.h"
141 #include "AliCDBEntry.h"
142 #include "AliShuttleInterface.h"
143
144 ClassImp(AliPreprocessor)
145
146 //______________________________________________________________________________________________
147 AliPreprocessor::AliPreprocessor(const char* detector, AliShuttleInterface* shuttle) :
148   TNamed(detector, ""),
149   fRun(-1),
150   fStartTime(0),
151   fEndTime(0),
152   fShuttle(shuttle),
153   fRunTypes()
154 {
155         SetTitle(Form("AliPreprocessor for %s subdetector.", detector));
156
157   if (!fShuttle)
158   {
159     AliFatal("Initialized without Shuttle instance.");
160     return;
161   }
162
163   fShuttle->RegisterPreprocessor(this);
164   
165   fRunTypes.SetOwner(kTRUE);
166 }
167
168 //______________________________________________________________________________________________
169 AliPreprocessor::~AliPreprocessor()
170 {
171 }
172
173 //______________________________________________________________________________________________
174 void AliPreprocessor::Initialize(Int_t run, UInt_t startTime,   UInt_t endTime)
175 {
176   // Sets the information of the run which is currently processed
177   // can be overriden for special behaviour, make sure that you call base class
178   // function
179
180   fRun = run;
181   fStartTime = startTime;
182   fEndTime = endTime;
183 }
184
185 //______________________________________________________________________________________________
186 Bool_t AliPreprocessor::Store(const char* pathLevel2, const char* pathLevel3, TObject* object,
187                 AliCDBMetaData* metaData, Int_t validityStart, Bool_t validityInfinite)
188 {
189   // Stores a CDB object in the storage for offline reconstruction. Objects that are not needed for
190   // offline reconstruction, but should be stored anyway (e.g. for debugging) should NOT be stored
191   // using this function. Use StoreReferenceData instead!
192   //
193   // This function should be called at the end of the preprocessor cycle
194   //
195   // The parameters are
196   //   1, 2) the 2nd and 3rd level of the object's path. The first level is the detector name which is provided
197   //         by the Preprocessor and converted to the Offline name. Thus the object's path is "DET/level2/level3"
198   //   3) the object to be stored
199   //   4) the metaData to be associated with the object
200   //   5) the validity start run number w.r.t. the current run,
201   //      if the data is valid only for this run leave the default 0
202   //   6) specifies if the calibration data is valid for infinity (this means until updated),
203   //      typical for calibration runs, the default is kFALSE
204   //
205   // The call is delegated to AliShuttleInterface
206
207   const char* offlineDetName = AliShuttleInterface::GetOfflineDetName(GetName());
208   if(!offlineDetName) return 0;
209
210   return fShuttle->Store(AliCDBPath(offlineDetName, pathLevel2, pathLevel3), object,
211                 metaData, validityStart, validityInfinite);
212 }
213
214 //______________________________________________________________________________________________
215 Bool_t AliPreprocessor::StoreReferenceData(const char* pathLevel2, const char* pathLevel3, TObject* object,
216                 AliCDBMetaData* metaData)
217 {
218   // Stores a CDB object in the storage for reference data. This objects will not be available during
219   // offline reconstrunction. Use this function for reference data only!
220   //
221   // This function should be called at the end of the preprocessor cycle
222   //
223   // The parameters are
224   //   1, 2) the 2nd and 3rd level of the object's path. The first level is the detector name which is provided
225   //         by the Preprocessor and converted to the Offline name. Thus the object's path is "DET/level2/level3"
226   //   3) the object to be stored
227   //   4) the metaData to be associated with the object
228   //
229   // The call is delegated to AliShuttleInterface
230
231   const char* offlineDetName = AliShuttleInterface::GetOfflineDetName(GetName());
232   if(!offlineDetName) return 0;
233
234   return fShuttle->StoreReferenceData(AliCDBPath(offlineDetName, pathLevel2, pathLevel3), object,
235                 metaData);
236 }
237     
238 //______________________________________________________________________________________________
239 Bool_t AliPreprocessor::StoreReferenceFile(const char* localFile, const char* gridFileName)
240 {
241         //
242         // Stores a file directly (without opening it) in the reference storage in the Grid
243         //
244         // The file is stored under the following location: 
245         // <base folder of reference storage>/<DET>/<RUN#>_<gridFileName>
246         // where <gridFileName> is the second parameter given to the function
247         //
248         // The call is delegated to AliShuttleInterface
249         
250         const char* offlineDetName = AliShuttleInterface::GetOfflineDetName(GetName());
251         if(!offlineDetName) return 0;
252         return fShuttle->StoreReferenceFile(GetName(), localFile, gridFileName);
253 }
254     
255 //______________________________________________________________________________________________
256 Bool_t AliPreprocessor::StoreRunMetadataFile(const char* localFile, const char* gridFileName)
257 {
258         //
259         // Stores Run metadata file to the Grid, in the run folder
260         //
261         // Only GRP can call this function.
262                 
263         TString detName(GetName());
264         if (detName != "GRP") 
265         {
266                 Log("StoreRunMetadataFile - Sorry, only Panos has this privilege.");
267                 return kFALSE;
268         }
269         return fShuttle->StoreRunMetadataFile(localFile, gridFileName);
270 }
271
272 //______________________________________________________________________________________________
273 const char* AliPreprocessor::GetFile(Int_t system, const char* id, const char* source)
274 {
275   // This function retrieves a file from the given system (kDAQ, kDCS, kHLT) with the given file id
276   // and from the given source in the system.
277   // The function returnes the path to the local file.
278   //
279   // The call is delegated to AliShuttleInterface
280
281   return fShuttle->GetFile(system, GetName(), id, source);
282 }
283
284 //______________________________________________________________________________________________
285 TList* AliPreprocessor::GetFileSources(Int_t system, const char* id)
286 {
287   // Returns a list of sources in a given system that saved a file with the given id
288   // if id is not given all sources are returned
289   //
290   // The call is delegated to AliShuttleInterface
291
292   return fShuttle->GetFileSources(system, GetName(), id);
293 }
294
295 //______________________________________________________________________________________________
296 TList* AliPreprocessor::GetFileIDs(Int_t system, const char* source)
297 {
298   // Returns a list of ids in a given system that saved a file with the given source
299   //
300   // The call is delegated to AliShuttleInterface
301
302   return fShuttle->GetFileIDs(system, GetName(), source);
303 }
304
305 //______________________________________________________________________________________________
306 void AliPreprocessor::Log(const char* message)
307 {
308   // Adds a log message to the Shuttle log of this preprocessor
309   //
310   // The call is delegated to AliShuttleInterface
311
312   fShuttle->Log(GetName(), message);
313 }
314
315 //______________________________________________________________________________________________
316 const char* AliPreprocessor::GetRunParameter(const char* param)
317 {
318   // Return run parameter read from run logbook
319   //
320   // The call is delegated to AliShuttleInterface
321
322   return fShuttle->GetRunParameter(param);
323 }
324
325 //______________________________________________________________________________________________
326 AliCDBEntry* AliPreprocessor::GetFromOCDB(const char* pathLevel2, const char* pathLevel3)
327 {
328   // Return object from OCDB valid for current run
329   //
330   // The call is delegated to AliShuttleInterface
331
332   const char* offlineDetName = AliShuttleInterface::GetOfflineDetName(GetName());
333   if (!offlineDetName) return 0;
334
335   return dynamic_cast<AliCDBEntry*>
336         (fShuttle->GetFromOCDB(GetName(), AliCDBPath(offlineDetName, pathLevel2, pathLevel3)));
337 }
338
339 //______________________________________________________________________________________________
340 const char* AliPreprocessor::GetRunType()
341 {
342   // Return run type string read from "run type" logbook
343   //
344   // The call is delegated to AliShuttleInterface
345
346   return fShuttle->GetRunType();
347 }
348
349 //______________________________________________________________________________________________
350 Bool_t AliPreprocessor::GetHLTStatus()
351 {
352   // Return HLT status (ON or OFF)
353   // Converts the HLT status from the status string read in the run logbook (not just a bool)
354   // The call is delegated to AliShuttleInterface
355
356   return fShuttle->GetHLTStatus();
357
358 }
359     
360 //______________________________________________________________________________________________
361 void AliPreprocessor::AddRunType(const char* runType)
362 {
363         // adds the given run type to the list of run types that are processed
364         // this function should be called in the constructor of the derived preprocessor
365         
366         if (!runType)
367                 return;
368         
369         fRunTypes.Add(new TObjString(runType));
370 }
371     
372 //______________________________________________________________________________________________
373 Bool_t AliPreprocessor::AliPreprocessor::ProcessRunType()
374 {
375         // searches for the current run type in the list of run types that are processed by this
376         // preprocessor. The list is populated by AddRunType
377         
378         const char* runType = GetRunType();
379
380         Log(Form("Checking if run type %s is in the list of run types to be processed by this preprocessor...", runType));
381         
382         if (fRunTypes.GetEntries() == 0)
383                 Log("WARNING! There are no run types defined. This preprocessor will never run.");
384
385         if (fRunTypes.FindObject(runType))
386         {
387                 Log("Run type found. Processing this run.");
388                 return kTRUE;
389         }
390         
391         Log("Run type not found. Skipping this run.");
392         return kFALSE;
393 }