1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
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)
21 #include "AliShuttleLogbookEntry.h"
23 #include "TTimeStamp.h"
26 #include <TSQLServer.h>
27 #include <TSQLResult.h>
29 #include <TObjArray.h>
31 ClassImp(AliShuttleLogbookEntry)
33 //______________________________________________________________________________________________
34 AliShuttleLogbookEntry::AliShuttleLogbookEntry() :
42 // default constructor
44 const UInt_t nDet = AliShuttle::NDetectors();
45 // fDetectorStatus = new Status[nDet];
46 memset(fDetectorStatus, kUnprocessed, nDet*sizeof(Status));
49 //______________________________________________________________________________________________
50 AliShuttleLogbookEntry::AliShuttleLogbookEntry(Int_t run, UInt_t startTime, UInt_t endTime, Status* status) :
53 fStartTime(startTime),
58 // default constructor
60 const UInt_t nDet = AliShuttle::NDetectors();
61 // fDetectorStatus = new Status[nDet];
62 memset(fDetectorStatus, kUnprocessed, nDet*sizeof(Status));
63 if(status) SetDetectorStatus(status);
66 //______________________________________________________________________________________________
67 AliShuttleLogbookEntry::~AliShuttleLogbookEntry() {
71 if(fServer->IsConnected()) fServer->Close();
74 // if(fDetectorStatus) delete[] fDetectorStatus; fDetectorStatus=0;
77 //______________________________________________________________________________________________
78 AliShuttleLogbookEntry::AliShuttleLogbookEntry(const AliShuttleLogbookEntry &c) :
81 fStartTime(c.fStartTime),
87 SetDetectorStatus(c.GetDetectorStatus());
90 //______________________________________________________________________________________________
91 AliShuttleLogbookEntry &AliShuttleLogbookEntry::operator=(const AliShuttleLogbookEntry &c)
96 ((AliShuttleLogbookEntry &) c).Copy(*this);
100 //______________________________________________________________________________________________
101 void AliShuttleLogbookEntry::Copy(TObject& c) const
105 AliShuttleLogbookEntry& target = (AliShuttleLogbookEntry &) c;
108 target.fStartTime = fStartTime;
109 target.fEndTime = fEndTime;
111 target.SetDetectorStatus(GetDetectorStatus());
114 //______________________________________________________________________________________________
115 AliShuttleLogbookEntry::Status AliShuttleLogbookEntry::GetDetectorStatus(const char* detCode) const
117 // get detector status from detector code
119 return GetDetectorStatus(AliShuttle::GetDetPos(detCode));
122 //______________________________________________________________________________________________
123 AliShuttleLogbookEntry::Status AliShuttleLogbookEntry::GetDetectorStatus(Int_t detPos) const
125 // get detector status from detector code
127 if(detPos < 0 || detPos >= (Int_t) AliShuttle::NDetectors()) {
128 AliError(Form("Invalid parameter: %d", detPos));
131 return fDetectorStatus[detPos];
134 //______________________________________________________________________________________________
135 void AliShuttleLogbookEntry::SetDetectorStatus(const char* detCode, Status status)
137 // set detector status from detector code
139 Int_t detPos = AliShuttle::GetDetPos(detCode);
141 SetDetectorStatus(detPos, status);
144 //______________________________________________________________________________________________
145 void AliShuttleLogbookEntry::SetDetectorStatus(Status* status)
147 // set detector status from detector code
149 for(UInt_t i=0; i < AliShuttle::NDetectors(); i++){
150 fDetectorStatus[i] = status[i];
154 //______________________________________________________________________________________________
155 void AliShuttleLogbookEntry::SetDetectorStatus(UInt_t detPos, Status status)
157 // set detector status from detector code
159 if(detPos >= AliShuttle::NDetectors()) {
160 AliError(Form("Shuttle has only %d subdetectors!", AliShuttle::NDetectors()));
163 fDetectorStatus[detPos] = status;
166 //______________________________________________________________________________________________
167 Bool_t AliShuttleLogbookEntry::IsDone() const{
168 // return TRUE if all subdetectors are in status DONE, FAILED or INACTIVE
170 for(UInt_t i=0; i < AliShuttle::NDetectors(); i++){
171 if(fDetectorStatus[i] == kUnprocessed) return kFALSE;
176 //______________________________________________________________________________________________
177 const char* AliShuttleLogbookEntry::GetDetectorStatusName(Status status)
179 // returns a name (string) of the detector status
182 case kUnprocessed: return "UNPROCESSED";
183 case kInactive: return "INACTIVE";
184 case kFailed: return "FAILED";
185 case kDone: return "DONE";
190 //______________________________________________________________________________________________
191 void AliShuttleLogbookEntry::Print(Option_t* /*option*/) const
193 // print current shuttle logbook entry
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";
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]));
207 AliInfo(Form("%s",message.Data()));
210 //______________________________________________________________________________________________
211 Bool_t AliShuttleLogbookEntry::Connect(){
212 // Connect to MySQL Server of the DAQ logbook
214 // check connection: if already connected return
215 if(fServer && fServer->IsConnected()) return kTRUE;
217 fServer = TSQLServer::Connect("mysql://pcald30.cern.ch","offline","alice");
219 if (!fServer || !fServer->IsConnected()) {
220 AliError("Can't establish connection to DAQ log book DB!");
221 if(fServer) delete fServer;
226 TSQLResult* aResult=0;
227 aResult = fServer->GetTables("REFSYSLOG");
232 //______________________________________________________________________________________________
233 Bool_t AliShuttleLogbookEntry::QueryShuttleLogbook(Int_t runNumber)
235 // Query DAQ's Shuttle logbook and fills detector status array
244 // check connection, in case connect
245 if(!Connect()) return kFALSE;
248 sqlQuery = Form("select * from logbook_shuttle where run = %d", run);
250 TSQLResult* aResult = fServer->Query(sqlQuery);
252 AliError(Form("Can't execute query <%s>!", sqlQuery.Data()));
256 // TODO Check field count!
257 if (aResult->GetFieldCount() != 24) {
258 AliError("Invalid SQL result field number!");
264 while ((aRow = aResult->Next())) {
265 TString runString(aRow->GetField(0), aRow->GetFieldLength(0));
266 Int_t run = runString.Atoi();
268 Status detStatus[24];
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;
288 SetDetectorStatus(detStatus);
297 //______________________________________________________________________________________________
298 Bool_t AliShuttleLogbookEntry::UpdateShuttleLogbook()
300 // Update Shuttle logbook table - TEST ONLY, USE WITH CARE!
303 if(!Connect()) return kFALSE;
305 TString sqlQuery("update logbook_shuttle set ");
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 += ", ";
312 sqlQuery += Form(" where run=%d;",GetRun());
314 AliInfo(Form("sqlQuery: %s", sqlQuery.Data()));
317 aResult = fServer->Query(sqlQuery);
319 AliError(Form("Can't execute query <%s>!", sqlQuery.Data()));
328 //______________________________________________________________________________________________
329 Bool_t AliShuttleLogbookEntry::UpdateShuttleLogbook(const char* detCode, Status status)
331 // Update Shuttle logbook table - TEST ONLY, USE WITH CARE!
334 if(AliShuttle::GetDetPos(detCode) < 0) return kFALSE;
335 SetDetectorStatus(detCode, status);
336 if(!Connect()) return kFALSE;
338 TString sqlQuery("update logbook_shuttle set ");
341 sqlQuery += Form("%s=\"%s\" ", detCode, GetDetectorStatusName(status));
343 sqlQuery += Form("where run=%d;",GetRun());
345 AliInfo(Form("sqlQuery: %s", sqlQuery.Data()));
348 aResult = fServer->Query(sqlQuery);
350 AliError(Form("Can't execute query <%s>!", sqlQuery.Data()));
359 //______________________________________________________________________________________________
360 Bool_t AliShuttleLogbookEntry::InsertNewRun(Int_t runNumber)
362 // Update Shuttle logbook table - TEST ONLY, USE WITH CARE!
364 if(runNumber<=0 && GetRun()<=0) return kFALSE;
365 if(runNumber>0) SetRun(runNumber);
366 if(!Connect()) return kFALSE;
368 TString sqlQuery = Form("insert into logbook_shuttle (run) values (%d);", GetRun());
370 AliInfo(Form("sqlQuery: %s", sqlQuery.Data()));
373 aResult = fServer->Query(sqlQuery);
375 AliError(Form("Can't execute query <%s>!", sqlQuery.Data()));
381 UpdateShuttleLogbook();