]> git.uio.no Git - u/mrichter/AliRoot.git/blob - SHUTTLE/AliShuttle.cxx
Cluster types (Gustavo)
[u/mrichter/AliRoot.git] / SHUTTLE / AliShuttle.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  2005/11/19 17:19:14  byordano
19 RetrieveDATEEntries and RetrieveConditionsData added
20
21 Revision 1.5  2005/11/19 11:09:27  byordano
22 AliShuttle declaration added
23
24 Revision 1.4  2005/11/17 17:47:34  byordano
25 TList changed to TObjArray
26
27 Revision 1.3  2005/11/17 14:43:23  byordano
28 import to local CVS
29
30 Revision 1.1.1.1  2005/10/28 07:33:58  hristov
31 Initial import as subdirectory in AliRoot
32
33 Revision 1.2  2005/09/13 08:41:15  byordano
34 default startTime endTime added
35
36 Revision 1.4  2005/08/30 09:13:02  byordano
37 some docs added
38
39 Revision 1.3  2005/08/29 21:15:47  byordano
40 some docs added
41
42 */
43
44 //
45 // This class is the main manager for AliShuttle. 
46 // It organizes the data retrieval from DCS and call the 
47 // interface methods of AliCDBPreProcessor.
48 // For every detector in AliShuttleConfgi (see AliShuttleConfig),
49 // data for its set of aliases is retrieved. If there is registered
50 // AliCDBPreProcessor for this detector than it will be used
51 // accroding to the schema (see AliCDBPreProcessor).
52 // If there isn't registered AliCDBPreProcessor than the retrieved
53 // data is stored automatically to the undelying AliCDBStorage.
54 // For detSpec is used the alias name.
55 //
56
57 #include "AliShuttle.h"
58
59 #include "AliCDBManager.h"
60 #include "AliCDBStorage.h"
61 #include "AliCDBId.h"
62 #include "AliCDBPreProcessor.h"
63 #include "AliShuttleConfig.h"
64 #include "AliDCSClient.h"
65 #include "AliLog.h"
66
67 #include <TObjString.h>
68
69 ClassImp(AliShuttle)
70
71 AliShuttle::AliShuttle(const AliShuttleConfig* config, 
72                 AliCDBStorage* cdbStorage, UInt_t timeout, Int_t retries):
73         fConfig(config), fStorage(cdbStorage), fTimeout(timeout), 
74         fRetries(retries), fCurrentRun(-1), fCurrentStartTime(0), 
75         fCurrentEndTime(0)
76 {
77         //
78         // config: AliShuttleConfig used
79         // cdbStorage: underlying AliCDBStorage
80         // timeout: timeout used for AliDCSClient connection
81         // retries: the number of retries in case of connection error.
82         //
83
84 }
85
86 AliShuttle::~AliShuttle() {
87         fPreProcessorMap.DeleteAll();
88 }
89
90 void AliShuttle::RegisterCDBPreProcessor(AliCDBPreProcessor* processor) {
91         //
92         // Registers new AliCDBPreProcessor.
93         // It uses GetName() for indentificator of the pre processor.
94         // The pre processor is registered it there isn't any other
95         // with the same identificator (GetName()).
96         //
97
98         if (fPreProcessorMap.GetValue(processor->GetName())) {
99                 AliWarning(Form("AliCDBPreProcessor %s is already registered!",
100                         processor->GetName()));
101                 return;
102         }
103
104         fPreProcessorMap.Add(new TObjString(processor->GetName()), processor);
105         processor->SetShuttle(this);
106 }
107
108 Bool_t AliShuttle::Store(const char* detector, const char* specType,
109                 TObject* object, AliCDBMetaData* metaData)
110 {
111         if (!fStorage) {
112                 AliError("Invalid storage object!");
113                 return kFALSE;
114         }
115
116         AliCDBId id(AliCDBPath(detector, "DCS", specType), 
117                 GetCurrentRun(), GetCurrentRun());
118         return fStorage->Put(object, id, metaData);
119 }
120
121 Bool_t AliShuttle::Process(Int_t run, UInt_t startTime, UInt_t endTime) {
122         //
123         // Makes data retrieval for all detectors in the configuration. 
124         // run: is the run number used
125         // startTime: is the run start time
126         // endTime: is the run end time
127         // Returns kFALSE in case of error occured and kTRUE otherwise
128         //
129
130         Bool_t hasError = kFALSE;
131
132         TIter iter(fConfig->GetDetectors());    
133         TObjString* aDetector;
134         while ((aDetector = (TObjString*) iter.Next())) {
135                 if(!Process(run, startTime, endTime, aDetector->String())) {
136                         hasError = kTRUE;
137                 }
138         }
139
140         return !hasError;
141 }
142
143 Bool_t AliShuttle::Process(Int_t run, UInt_t startTime, UInt_t endTime,
144                 const char* detector)
145 {
146         //
147         // Makes data retrieval just for one specific detector. 
148         // Threre should be a configuration for this detector.
149         // run: is the run number used
150         // startTime: is the run start time
151         // endTime: is the run end time
152         // detector: detector for which the retrieval will be made
153         // Returns kFALSE in case of error occured and kTRUE otherwise
154         //
155
156         AliInfo(Form("Retrieving values for %s, run %d", detector, run));
157
158         if (!fConfig->HasDetector(detector)) {
159                 AliError(Form("There isn't any configuration for %s",
160                                 detector));
161                 return kFALSE;
162         }
163
164         fCurrentRun = run;
165         fCurrentStartTime = startTime;
166         fCurrentEndTime = endTime;
167
168         TString host(fConfig->GetHost(detector));
169         Int_t port = fConfig->GetPort(detector);
170
171         AliCDBPreProcessor* aPreProcessor = 
172                 (AliCDBPreProcessor*) fPreProcessorMap.GetValue(detector);
173
174         TIter iter(fConfig->GetAliases(detector));
175         TObjString* anAlias;
176
177         Bool_t hasError = kFALSE;
178
179         if (aPreProcessor) {
180                 aPreProcessor->Initialize(run, startTime, endTime);
181
182                 TObjArray valueSet;
183                 while ((anAlias = (TObjString*) iter.Next())) {
184                         Bool_t result = GetValueSet(host, port, 
185                                         anAlias->String(), valueSet);
186                         
187                         aPreProcessor->Process(anAlias->String(), valueSet, 
188                                         !result);
189
190                         valueSet.Delete();
191                 }
192
193                 aPreProcessor->Finalize();      
194
195         } else {
196                 AliCDBMetaData metaData;
197                 metaData.SetProperty("StartTime", 
198                                 new AliSimpleValue(startTime));
199                 metaData.SetProperty("EndTime",
200                                 new AliSimpleValue(endTime));
201                 metaData.SetComment("Automatically stored by AliShuttle!");
202
203                 TObjArray valueSet;
204                 while ((anAlias = (TObjString*) iter.Next())) {
205                         if (GetValueSet(host, port, anAlias->String(), 
206                                 valueSet)) {
207                                 if (!Store(detector, anAlias->String(),
208                                         &valueSet, &metaData)) {
209                                         AliError(Form("Can't store %s for %s!",
210                                                 anAlias->String().Data(),
211                                                 detector));
212                                         hasError = kTRUE;
213                                 }               
214                         }
215
216                         valueSet.Delete();
217                 }
218         }
219         
220         fCurrentRun = -1;
221         fCurrentStartTime = 0;
222         fCurrentEndTime = 0;
223
224         return !hasError;
225 }
226
227 Bool_t AliShuttle::GetValueSet(const char* host, Int_t port, const char* alias,
228                                 TObjArray& valueSet)
229 {
230         AliDCSClient client(host, port, fTimeout, fRetries);
231         if (!client.IsConnected()) {
232                 return kFALSE;  
233         }
234
235         Int_t result = client.GetAliasValues(alias, 
236                 GetCurrentStartTime(), GetCurrentEndTime(), valueSet);
237
238         if (result < 0) {
239                 AliError(Form("Can't get '%s'! Reason: %s",
240                         alias, AliDCSClient::GetErrorString(result)));
241
242                 if (result == AliDCSClient::fgkServerError) {
243                         AliError(Form("Server error: %s",
244                                 client.GetServerError().Data()));
245                 }
246
247                 return kFALSE;
248         }
249
250         return kTRUE;
251 }