update (alberto):
[u/mrichter/AliRoot.git] / SHUTTLE / AliShuttleLogbookEntry.cxx
CommitLineData
2bb7b766 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// This class is a container for the data queried from DAQ's logbook and logbook_shuttle tables.
18// It holds the run number, the start time and end time of the run,
19// and the array of the detectors' status (Unprocessed, Inactive, Failed, Done)
20
21#include "AliShuttleLogbookEntry.h"
22#include "AliLog.h"
23#include "TTimeStamp.h"
24
25// TODO test only!
26#include <TSQLServer.h>
27#include <TSQLResult.h>
28#include <TSQLRow.h>
29#include <TObjArray.h>
30
31ClassImp(AliShuttleLogbookEntry)
32
33//______________________________________________________________________________________________
34AliShuttleLogbookEntry::AliShuttleLogbookEntry() :
35TObject(),
36fRun(-1),
37fStartTime(0),
38fEndTime(0),
39//fDetectorStatus(0),
40fServer(0)
41{
42 // default constructor
43
44 const UInt_t nDet = AliShuttle::NDetectors();
45// fDetectorStatus = new Status[nDet];
46 memset(fDetectorStatus, kUnprocessed, nDet*sizeof(Status));
47}
48
49//______________________________________________________________________________________________
50AliShuttleLogbookEntry::AliShuttleLogbookEntry(Int_t run, UInt_t startTime, UInt_t endTime, Status* status) :
51TObject(),
52fRun(run),
53fStartTime(startTime),
54fEndTime(endTime),
55//fDetectorStatus(0),
56fServer(0)
57{
58 // default constructor
59
60 const UInt_t nDet = AliShuttle::NDetectors();
61// fDetectorStatus = new Status[nDet];
62 memset(fDetectorStatus, kUnprocessed, nDet*sizeof(Status));
63 if(status) SetDetectorStatus(status);
64}
65
66//______________________________________________________________________________________________
67AliShuttleLogbookEntry::~AliShuttleLogbookEntry() {
68// destructor
69
70 if(fServer){
71 if(fServer->IsConnected()) fServer->Close();
72 delete fServer;
73 }
74// if(fDetectorStatus) delete[] fDetectorStatus; fDetectorStatus=0;
75}
76
77//______________________________________________________________________________________________
78AliShuttleLogbookEntry::AliShuttleLogbookEntry(const AliShuttleLogbookEntry &c) :
79TObject(),
80fRun(c.fRun),
81fStartTime(c.fStartTime),
82fEndTime(c.fEndTime),
83fServer(0)
84{
85 // copy constructor
86
87 SetDetectorStatus(c.GetDetectorStatus());
88}
89
90//______________________________________________________________________________________________
91AliShuttleLogbookEntry &AliShuttleLogbookEntry::operator=(const AliShuttleLogbookEntry &c)
92{
93 // assigment operator
94
95 if (this != &c)
96 ((AliShuttleLogbookEntry &) c).Copy(*this);
97 return *this;
98}
99
100//______________________________________________________________________________________________
101void AliShuttleLogbookEntry::Copy(TObject& c) const
102{
103 // copy function
104
105 AliShuttleLogbookEntry& target = (AliShuttleLogbookEntry &) c;
106
107 target.fRun = fRun;
108 target.fStartTime = fStartTime;
109 target.fEndTime = fEndTime;
110
111 target.SetDetectorStatus(GetDetectorStatus());
112}
113
114//______________________________________________________________________________________________
115AliShuttleLogbookEntry::Status AliShuttleLogbookEntry::GetDetectorStatus(const char* detCode) const
116{
117// get detector status from detector code
118
119 return GetDetectorStatus(AliShuttle::GetDetPos(detCode));
120}
121
122//______________________________________________________________________________________________
123AliShuttleLogbookEntry::Status AliShuttleLogbookEntry::GetDetectorStatus(Int_t detPos) const
124{
125// get detector status from detector code
126
127 if(detPos < 0 || detPos >= (Int_t) AliShuttle::NDetectors()) {
128 AliError(Form("Invalid parameter: %d", detPos));
129 return kUnprocessed;
130 }
131 return fDetectorStatus[detPos];
132}
133
134//______________________________________________________________________________________________
135void AliShuttleLogbookEntry::SetDetectorStatus(const char* detCode, Status status)
136{
137// set detector status from detector code
138
139 Int_t detPos = AliShuttle::GetDetPos(detCode);
140 if(detPos<0) return;
141 SetDetectorStatus(detPos, status);
142}
143
144//______________________________________________________________________________________________
145void AliShuttleLogbookEntry::SetDetectorStatus(Status* status)
146{
147// set detector status from detector code
148
149 for(UInt_t i=0; i < AliShuttle::NDetectors(); i++){
150 fDetectorStatus[i] = status[i];
151 }
152}
153
154//______________________________________________________________________________________________
155void AliShuttleLogbookEntry::SetDetectorStatus(UInt_t detPos, Status status)
156{
157// set detector status from detector code
158
159 if(detPos >= AliShuttle::NDetectors()) {
160 AliError(Form("Shuttle has only %d subdetectors!", AliShuttle::NDetectors()));
161 return;
162 }
163 fDetectorStatus[detPos] = status;
164}
165
166//______________________________________________________________________________________________
167Bool_t AliShuttleLogbookEntry::IsDone() const{
168// return TRUE if all subdetectors are in status DONE, FAILED or INACTIVE
169
170 for(UInt_t i=0; i < AliShuttle::NDetectors(); i++){
171 if(fDetectorStatus[i] == kUnprocessed) return kFALSE;
172 }
173 return kTRUE;
174}
175
176//______________________________________________________________________________________________
177const char* AliShuttleLogbookEntry::GetDetectorStatusName(Status status)
178{
179 // returns a name (string) of the detector status
180
181 switch (status){
182 case kUnprocessed: return "UNPROCESSED";
183 case kInactive: return "INACTIVE";
184 case kFailed: return "FAILED";
185 case kDone: return "DONE";
186 }
187 return 0;
188}
189
190//______________________________________________________________________________________________
191void AliShuttleLogbookEntry::Print(Option_t* /*option*/) const
192{
193 // print current shuttle logbook entry
194
195 TString message = "\n*** Run parameters ***\n";
196 TTimeStamp startTimeStamp(fStartTime);
197 TTimeStamp endTimeStamp(fEndTime);
198 message += Form("\tRun \t\t%d\n", fRun);
199 message += Form("\tStarted \t%s\n", startTimeStamp.AsString("s"));
200 message += Form("\tFinished \t%s\n", endTimeStamp.AsString("s"));
201 message += "\n*** Detector status ***\n";
202
203 for(UInt_t i=0; i < AliShuttle::NDetectors(); i++)
204 message += Form("\t%2d - %s: %s\n", i, AliShuttle::GetDetCode(i),
205 GetDetectorStatusName(fDetectorStatus[i]));
206
207 AliInfo(Form("%s",message.Data()));
208}
209
210//______________________________________________________________________________________________
211Bool_t AliShuttleLogbookEntry::Connect(){
212// Connect to MySQL Server of the DAQ logbook
213
214 // check connection: if already connected return
215 if(fServer && fServer->IsConnected()) return kTRUE;
216
217 fServer = TSQLServer::Connect("mysql://pcald30.cern.ch","offline","alice");
218
219 if (!fServer || !fServer->IsConnected()) {
220 AliError("Can't establish connection to DAQ log book DB!");
221 if(fServer) delete fServer;
222 return kFALSE;
223 }
224
225 // Get table
226 TSQLResult* aResult=0;
227 aResult = fServer->GetTables("REFSYSLOG");
228 delete aResult;
229 return kTRUE;
230}
231
232//______________________________________________________________________________________________
233Bool_t AliShuttleLogbookEntry::QueryShuttleLogbook(Int_t runNumber)
234{
235// Query DAQ's Shuttle logbook and fills detector status array
236
237 Int_t run;
238 if(runNumber < 0) {
239 run = GetRun();
240 } else{
241 run = runNumber;
242 }
243
244 // check connection, in case connect
245 if(!Connect()) return kFALSE;
246
247 TString sqlQuery;
248 sqlQuery = Form("select * from logbook_shuttle where run = %d", run);
249
250 TSQLResult* aResult = fServer->Query(sqlQuery);
251 if (!aResult) {
252 AliError(Form("Can't execute query <%s>!", sqlQuery.Data()));
253 return kFALSE;
254 }
255
256 // TODO Check field count!
257 if (aResult->GetFieldCount() != 24) {
258 AliError("Invalid SQL result field number!");
259 delete aResult;
260 return kFALSE;
261 }
262
263 TSQLRow* aRow;
264 while ((aRow = aResult->Next())) {
265 TString runString(aRow->GetField(0), aRow->GetFieldLength(0));
266 Int_t run = runString.Atoi();
267
268 Status detStatus[24];
269
270 // loop on detectors
271 for(UInt_t ii = 0; ii < 24; ii++){
272 TString detCode(aResult->GetFieldName(ii));
273 Int_t detPos = AliShuttle::GetDetPos(detCode.Data());
274 if(detPos < 0) continue;
275 TString statusString(aRow->GetField(ii), aRow->GetFieldLength(ii));
276 if(statusString == "UNPROCESSED"){
277 detStatus[detPos] = AliShuttleLogbookEntry::kUnprocessed;
278 } else if (statusString == "INACTIVE") {
279 detStatus[detPos] = AliShuttleLogbookEntry::kInactive;
280 } else if (statusString == "FAILED") {
281 detStatus[detPos] = AliShuttleLogbookEntry::kFailed;
282 } else if (statusString == "DONE") {
283 detStatus[detPos] = AliShuttleLogbookEntry::kDone;
284 }
285 }
286
287 SetRun(run);
288 SetDetectorStatus(detStatus);
289 delete aRow;
290 }
291
292 Print("");
293
294 delete aResult;
295 return kTRUE;
296}
297//______________________________________________________________________________________________
298Bool_t AliShuttleLogbookEntry::UpdateShuttleLogbook()
299{
300 // Update Shuttle logbook table - TEST ONLY, USE WITH CARE!
301
302
303 if(!Connect()) return kFALSE;
304
305 TString sqlQuery("update logbook_shuttle set ");
306
307 for(UInt_t i=0; i < AliShuttle::NDetectors(); i++){
308 sqlQuery += Form("%s=\"%s\"", AliShuttle::GetDetCode(i), GetDetectorStatusName(fDetectorStatus[i]));
309 if(i < AliShuttle::NDetectors()-1) sqlQuery += ", ";
310 }
311
312 sqlQuery += Form(" where run=%d;",GetRun());
313
314 AliInfo(Form("sqlQuery: %s", sqlQuery.Data()));
315
316 TSQLResult* aResult;
317 aResult = fServer->Query(sqlQuery);
318 if (!aResult) {
319 AliError(Form("Can't execute query <%s>!", sqlQuery.Data()));
320 return kFALSE;
321 }
322
323 delete aResult;
324
325 return kTRUE;
326}
327
328//______________________________________________________________________________________________
329Bool_t AliShuttleLogbookEntry::UpdateShuttleLogbook(const char* detCode, Status status)
330{
331 // Update Shuttle logbook table - TEST ONLY, USE WITH CARE!
332
333
334 if(AliShuttle::GetDetPos(detCode) < 0) return kFALSE;
335 SetDetectorStatus(detCode, status);
336 if(!Connect()) return kFALSE;
337
338 TString sqlQuery("update logbook_shuttle set ");
339
340
341 sqlQuery += Form("%s=\"%s\" ", detCode, GetDetectorStatusName(status));
342
343 sqlQuery += Form("where run=%d;",GetRun());
344
345 AliInfo(Form("sqlQuery: %s", sqlQuery.Data()));
346
347 TSQLResult* aResult;
348 aResult = fServer->Query(sqlQuery);
349 if (!aResult) {
350 AliError(Form("Can't execute query <%s>!", sqlQuery.Data()));
351 return kFALSE;
352 }
353
354 delete aResult;
355
356 return kTRUE;
357}
358
359//______________________________________________________________________________________________
360Bool_t AliShuttleLogbookEntry::InsertNewRun(Int_t runNumber)
361{
362 // Update Shuttle logbook table - TEST ONLY, USE WITH CARE!
363
364 if(runNumber<=0 && GetRun()<=0) return kFALSE;
365 if(runNumber>0) SetRun(runNumber);
366 if(!Connect()) return kFALSE;
367
368 TString sqlQuery = Form("insert into logbook_shuttle (run) values (%d);", GetRun());
369
370 AliInfo(Form("sqlQuery: %s", sqlQuery.Data()));
371
372 TSQLResult* aResult;
373 aResult = fServer->Query(sqlQuery);
374 if (!aResult) {
375 AliError(Form("Can't execute query <%s>!", sqlQuery.Data()));
376 return kFALSE;
377 }
378
379 delete aResult;
380
381 UpdateShuttleLogbook();
382
383 return kTRUE;
384}