//
TString offDetStr(GetOfflineDetName(detector));
- TString dir;
+ static TString dir;
if (offDetStr == "ITS" || offDetStr == "MUON" || offDetStr == "PHOS")
{
dir.Form("%s/%s/%s", base, offDetStr.Data(), detector);
}
return dir.Data();
-
-
}
//______________________________________________________________________________________________
if (fTestMode == kNone)
{
Log("SHUTTLE", Form("ContinueProcessing - %s requires strict run ordering"
- " but this is not the first unprocessed run!"));
+ " but this is not the first unprocessed run!",fCurrentDetector.Data()));
return kFALSE;
}
else
Log("SHUTTLE", Form("ContinueProcessing - In TESTMODE - "
"Although %s requires strict run ordering "
"and this is not the first unprocessed run, "
- "the SHUTTLE continues"));
+ "the SHUTTLE continues",fCurrentDetector.Data()));
}
}
Bool_t increaseCount = kTRUE;
if (status->GetStatus() == AliShuttleStatus::kDCSError ||
status->GetStatus() == AliShuttleStatus::kDCSStarted ||
- status->GetStatus() == AliShuttleStatus::kFXSError)
+ status->GetStatus() == AliShuttleStatus::kFXSError ||
+ status->GetStatus() == AliShuttleStatus::kOCDBError)
increaseCount = kFALSE;
UpdateShuttleStatus(AliShuttleStatus::kStarted, increaseCount);
AliShuttleStatus *currentStatus = ReadShuttleStatus();
AliShuttleStatus::Status newStatus = AliShuttleStatus::kInvalid;
- if (currentStatus->GetStatus() <= AliShuttleStatus::kPPDone)
+ if (currentStatus->GetStatus() == AliShuttleStatus::kDCSStarted)
+ {
+ // in case the pp goes in TimeOut while retrieving the DCS DPs
+ // set status to kDCSError
+
+ logMsg.Form("Process - Process of %s timed out while retrieving the DCS DataPoints. Run time: %ld seconds. Killing... and setting status to DCSError.",
+ fCurrentDetector.Data(), expiredTime);
+ newStatus = AliShuttleStatus::kDCSError;
+ }
+ else if (currentStatus->GetStatus() <= AliShuttleStatus::kPPDone)
{
// in case pp not yet done set status to kPPTimeOut
- logMsg.Form("Process - Process of %s timed out. Run time: %d seconds. Killing...",
+ logMsg.Form("Process - Process of %s timed out. Run time: %ld seconds. Killing...",
fCurrentDetector.Data(), expiredTime);
newStatus = AliShuttleStatus::kPPTimeOut;
}
// in case the pp goes in TimeOut while storing the objects in the OCDB
// set status to kStoreError
- logMsg.Form("Process - Process of %s timed out while storing the OCDB object. Run time: %d seconds. Killing... and setting status to StoreError.",
+ logMsg.Form("Process - Process of %s timed out while storing the OCDB object. Run time: %ld seconds. Killing... and setting status to StoreError.",
fCurrentDetector.Data(), expiredTime);
newStatus = AliShuttleStatus::kStoreError;
}
{
// in other cases don't change the status
- logMsg.Form("Process - Process of %s timed out in status = %s. Run time: %d seconds. Killing... without changing the status",
+ logMsg.Form("Process - Process of %s timed out in status = %s. Run time: %ld seconds. Killing... without changing the status",
fCurrentDetector.Data(), currentStatus->GetStatusName(), expiredTime);
}
if (expiredTime % 60 == 0)
{
Log("SHUTTLE", Form("Process - %s: Checking process. "
- "Run time: %d seconds - Memory consumption: %d KB",
+ "Run time: %ld seconds - Memory consumption: %d KB",
fCurrentDetector.Data(), expiredTime, mem));
SendAlive();
}
Log("SHUTTLE", "Process - Could not redirect stderr");
}
+
+ Log("SHUTTLE", "Executing TGrid::Connect");
+ TGrid::Connect("alien://");
TString wd = gSystem->WorkingDirectory();
Int_t dir_lev1 = GetCurrentRun()/10000;
else if (success == 0)
{
Log("SHUTTLE",
- Form("\t\t\t****** run %d - %s: PP ERROR ******",
+ Form("\t\t\t****** run %d - %s: ERROR ******",
GetCurrentRun(), aDetector->GetName()));
}
return 2;
}
+ // checking if OCDB is reachable
+ AliCDBEntry* testEntry = GetFromOCDB("SHUTTLE","GRP/CTP/DummyConfig");
+ if (!testEntry){
+ // OCDB is not accessible, going in OCDBError for current detector
+ AliError("OCDB Test entry not accessible");
+ UpdateShuttleStatus(AliShuttleStatus::kOCDBError);
+ return 0;
+ }
+
TMap* dcsMap = new TMap();
aPreprocessor->Initialize(GetCurrentRun(), GetCurrentStartTime(), GetCurrentEndTime());
}
// TODO Check field count!
- const UInt_t nCols = 25;
+ const UInt_t nCols = 26;
if (aResult->GetFieldCount() != (Int_t) nCols) {
Log("SHUTTLE", "Invalid SQL result field number!");
delete aResult;
UInt_t startTime = entry->GetStartTime();
UInt_t endTime = entry->GetEndTime();
Bool_t ecsSuccess = entry->GetECSSuccess();
-
- TString totEventsStr = entry->GetRunParameter("totalEvents");
- Int_t totEvents = totEventsStr.Atoi();
+ TString runType = entry->GetRunType();
+ TString tmpdaqstartTime = entry->GetRunParameter("DAQ_time_start");
+ TString recordingFlagString = entry->GetRunParameter("GDCmStreamRecording");
+ UInt_t recordingFlag = recordingFlagString.Atoi();
+ UInt_t daqstartTime = tmpdaqstartTime.Atoi();
UInt_t now = time(0);
- // TODO make this a configuration parameter
Int_t dcsDelay = fConfig->GetDCSDelay()+fConfig->GetDCSQueryOffset();
-
- // runs are accepted if they have ecsSuccess set or more than 1 event
- if (startTime != 0 && endTime != 0 && endTime > startTime && (totEvents > 1 || ecsSuccess) && (endTime < now - dcsDelay))
- {
- if (ecsSuccess == kFALSE)
- Log("SHUTTLE", Form("Processing run %d although in status ECS failure, Reason: %s", run, entry->GetRunParameter("eor_reason")));
- return entry;
- }
Bool_t skip = kFALSE;
- if (endTime != 0 && endTime >= now - dcsDelay)
- {
- Log("SHUTTLE", Form("Skipping run %d for now, because DCS buffer time is not yet expired", run));
- }
- else if (totEvents <= 1)
- {
- Log("SHUTTLE", Form("QueryRunParameters - Run %d has 1 event or less - Skipping!", run));
- skip = kTRUE;
- }
- else
- {
- Log("SHUTTLE", Form("QueryRunParameters - Invalid parameters for Run %d: "
- "startTime = %d, endTime = %d. Skipping (Shuttle won't be marked as DONE)!",
- run, startTime, endTime));
+ // runs are processed if
+ // a) runType is PHYSICS and ecsSuccess is set
+ // b) runType is not PHYSICS and (ecsSuccess is set or DAQ_time_start is non-0)
+ // effectively this means that all runs are processed that started properly (ecsSucess behaviour is different for PHYSICS and non-PHYSICS runs (check with ECS!)
+ if (startTime != 0 && endTime != 0) {
+ if (endTime > startTime) {
+ if (endTime >= now - dcsDelay) {
+ Log("SHUTTLE", Form("Skipping run %d for now, because DCS buffer time is not yet expired", run));
+ } else {
+ if ((runType == "PHYSICS" || runType == "STANDALONE") && recordingFlag == 0){
+ Log("SHUTTLE", Form("QueryRunParameters - Run type for run %d is %s but the recording is OFF - Skipping!", run, runType.Data()));
+ skip = kTRUE;
+ }
+ else {
+ if (runType == "PHYSICS") {
+ if (ecsSuccess) {
+ return entry;
+ } else {
+ Log("SHUTTLE", Form("QueryRunParameters - Run type for run %d is PHYSICS but ECS success flag not set (Reason = %s) - Skipping!", run, entry->GetRunParameter("eor_reason")));
+ skip = kTRUE;
+ }
+ } else {
+ if (ecsSuccess || daqstartTime > 0) {
+ if (ecsSuccess == kFALSE)
+ Log("SHUTTLE", Form("Processing run %d although in status ECS failure (Reason: %s), since run type != PHYSICS and DAQ_time_start != 0", run, entry->GetRunParameter("eor_reason")));
+ return entry;
+ } else {
+ Log("SHUTTLE", Form("QueryRunParameters - Run type for run %d is %s, ECS success flag was not set (Reason = %s) and DAQ_time_start was NULL - Skipping!", run, runType.Data(), entry->GetRunParameter("eor_reason")));
+ skip = kTRUE;
+ }
+ }
+ }
+ }
+ } else {
+ Log("SHUTTLE", Form("QueryRunParameters - Invalid parameters for run %d: startTime equal to endTime: %d %d - Skipping!", run, startTime, endTime));
+ skip = kTRUE;
+ }
+ } else {
+ Log("SHUTTLE", Form("QueryRunParameters - Invalid parameters for Run %d: "
+ "startTime = %d, endTime = %d. Skipping (Shuttle won't be marked as DONE)!",
+ run, startTime, endTime));
}
if (skip)
//
// check connection: if already connected return
+
if(fServer[system] && fServer[system]->IsConnected()) {
- // ping the server --> automatic reconnection should occur if it was broken but the
- // server is still alive
- fServer[system]->Ping();
- return kTRUE;
+ // ping the server
+ if (fServer[system]->PingVerify()==kTRUE){ // connection is still alive
+ return kTRUE;
+ }
+ else{
+ AliWarning(Form("Connection got lost to FXS database for %s. Closing and reconnecting.",
+ AliShuttleInterface::GetSystemName(system)));
+ fServer[system]->Close();
+ delete fServer[system];
+ fServer[system] = 0x0;
+ }
}
TString dbHost, dbUser, dbPass, dbName;
delete aFXSarray;
- TString sqlQuery = Form("update %s set time_processed=%d %s", fConfig->GetFXSdbTable(system),
- now.GetSec(), whereClause.Data());
+ TString sqlQuery = Form("update %s set time_processed=%ld %s", fConfig->GetFXSdbTable(system),
+ (ULong_t)now.GetSec(), whereClause.Data());
AliDebug(2, Form("SQL query: \n%s",sqlQuery.Data()));
if (detName == "ALL") whereClause = Form("where run=%d and time_processed IS NULL;",GetCurrentRun());
else whereClause = Form("where run=%d and detector=\"%s\" and time_processed IS NULL;",GetCurrentRun(), detector);
- Log("SHUTTLE",Form(" whereClause = %s ",whereClause.Data()));
+ //Log("SHUTTLE",Form(" whereClause = %s ",whereClause.Data()));
- TString sqlQuery = Form("update %s set time_processed=%d %s", fConfig->GetFXSdbTable(system),
- now.GetSec(), whereClause.Data());
+ TString sqlQuery = Form("update %s set time_processed=%ld %s", fConfig->GetFXSdbTable(system),
+ (ULong_t)now.GetSec(), whereClause.Data());
AliDebug(2, Form("SQL query: \n%s",sqlQuery.Data()));
GetCurrentRun(), fCurrentDetector.Data());
- TString sqlQuery = Form("update %s set time_processed=%d %s", fConfig->GetFXSdbTable(system),
- now.GetSec(), whereClause.Data());
+ TString sqlQuery = Form("update %s set time_processed=%ld %s", fConfig->GetFXSdbTable(system),
+ (ULong_t)now.GetSec(), whereClause.Data());
AliDebug(2, Form("SQL query: \n%s",sqlQuery.Data()));
}
//______________________________________________________________________________________________
-void AliShuttle::Log(const char* detector, const char* message)
+void AliShuttle::Log(const char* detector, const char* message, UInt_t level)
{
//
// Fill log string with a message
toLog += Form("run %d - ", GetCurrentRun());
toLog += Form("%s", message);
- AliInfo(toLog.Data());
+ AliLog::Message(level, toLog, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__);
// if we redirect the log output already to the file, leave here
if (fOutputRedirected && strcmp(detector, "SHUTTLE") != 0)
body = Form("Dear %s FXS experts, \n\n",sys.Data());
body += Form("SHUTTLE couldn\'t retrieve data from the FXS for detector %s "
"in run %d!!\n\n", fCurrentDetector.Data(), GetCurrentRun());
+ body += Form("The contacted server was:\nDB: %s\nFXS:%s\n\n", fConfig->GetFXSdbHost(system), fConfig->GetFXSHost(system));
}
else {
subject = Form("%s %s Shuttle preprocessor FAILED in run %d (run type = %s)!",
body += Form("Find the %s log for the current run on \n\n"
- "\thttp://pcalishuttle01.cern.ch:8880/%s/%d/%d/%s.log \n\n",
+ "\thttp://pcalishuttle02.cern.ch/%s/%d/%d/%s.log \n\n",
fCurrentDetector.Data(), logFolder.Data(), GetCurrentRun()/10000,
GetCurrentRun(), fCurrentDetector.Data());
body += Form("The last 15 lines of %s log file are following:\n\n", fCurrentDetector.Data());
if (result->GetRowCount() == 0)
{
- Log("SHUTTLE", "ERROR: Trigger configuration not found in logbook_trigger_config");
+ Log("SHUTTLE", "WARNING: Trigger configuration not found in logbook_trigger_config");
delete result;
return 0;
}
return triggerConfig;
}
+//______________________________________________________________________________________________
+const char* AliShuttle::GetCTPTimeParams()
+{
+ // Receives the CTP time parameters from the DAQ logbook for the current run
+
+ // check connection, if needed reconnect
+ if (!Connect(3))
+ return 0;
+
+ TString sqlQuery;
+ sqlQuery.Form("SELECT alignmentFile FROM logbook_trigger_config WHERE run = %d", GetCurrentRun());
+ TSQLResult* result = fServer[3]->Query(sqlQuery);
+ if (!result)
+ {
+ Log("SHUTTLE", Form("ERROR: Can't execute query <%s>!", sqlQuery.Data()));
+ return 0;
+ }
+
+ if (result->GetRowCount() == 0)
+ {
+ Log("SHUTTLE", "WARNING: CTP time params not found in logbook_trigger_config");
+ delete result;
+ return 0;
+ }
+
+ TSQLRow* row = result->Next();
+ if (!row)
+ {
+ Log("SHUTTLE", "ERROR: Could not receive logbook_trigger_config data");
+ delete result;
+ return 0;
+ }
+
+ // static, so that pointer remains valid when it is returned to the calling class
+ static TString triggerTimeParams(row->GetField(0));
+
+ delete row;
+ row = 0;
+
+ delete result;
+ result = 0;
+
+ Log("SHUTTLE", Form("Found trigger time parameters: %s", triggerTimeParams.Data()));
+
+ return triggerTimeParams;
+}
+
+//______________________________________________________________________________________________
+const char* AliShuttle::GetTriggerDetectorMask()
+{
+ // Receives the trigger detector mask from DAQ logbook
+
+ // check connection, if needed reconnect
+ if (!Connect(3))
+ return 0;
+
+ TString sqlQuery;
+ sqlQuery.Form("SELECT BIN(BIT_OR(inputDetectorMask)) from logbook_trigger_clusters WHERE run = %d;", GetCurrentRun());
+ TSQLResult* result = fServer[3]->Query(sqlQuery);
+ if (!result)
+ {
+ Log("SHUTTLE", Form("ERROR: Can't execute query <%s>!", sqlQuery.Data()));
+ return 0;
+ }
+
+ if (result->GetRowCount() == 0)
+ {
+ Log("SHUTTLE", "ERROR: Trigger Detector Mask not found in logbook_trigger_clusters");
+ delete result;
+ return 0;
+ }
+
+ TSQLRow* row = result->Next();
+ if (!row)
+ {
+ Log("SHUTTLE", "ERROR: Could not receive logbook_trigger_clusters data");
+ delete result;
+ return 0;
+ }
+
+ // static, so that pointer remains valid when it is returned to the calling class
+ static TString triggerDetectorMask(row->GetField(0));
+
+ delete row;
+ row = 0;
+
+ delete result;
+ result = 0;
+
+ Log("SHUTTLE", Form("Found Trigger Detector Mask: %s", triggerDetectorMask.Data()));
+
+ return triggerDetectorMask;
+}
+
//______________________________________________________________________________________________
void AliShuttle::SetShuttleTempDir(const char* tmpDir)
{
return GetCurrentEndTime()+fConfig->GetDCSQueryOffset();
}
+//______________________________________________________________________________________________
+void AliShuttle::SendMLFromDet(const char* value)
+{
+ //
+ // Sending an information coming from the current detector to ML
+ //
+
+ TMonaLisaText mlText(Form("%s_RunCondition", fCurrentDetector.Data()), value);
+
+ TList mlList;
+ mlList.Add(&mlText);
+
+ TString mlID;
+ mlID.Form("%d", GetCurrentRun());
+ fMonaLisa->SendParameters(&mlList, mlID);
+
+ return;
+}
+//______________________________________________________________________________________________
+TString* AliShuttle::GetLTUConfig(const char* det)
+{
+ //
+ // Getting ltuFineDelay1, ltuFineDelay2, ltuBCDelay for detector det from logbook_detectors table in logbook
+ //
+
+ if (!Connect(3))
+ return 0;
+
+ TString sqlQuery;
+ sqlQuery.Form("select LTUFineDelay1, LTUFineDelay2, LTUBCDelayAdd from logbook_detectors WHERE run_number = %d and detector = \"%s\";", GetCurrentRun(),det);
+
+ TSQLResult* result = fServer[3]->Query(sqlQuery);
+ if (!result){
+ Log("SHUTTLE","ERROR: No result found for the LTU configuration query");
+ return 0x0;
+ }
+ if (result->GetRowCount() == 0){
+ Log("SHUTTLE",Form("ERROR: LTU configuration not found in logbook_detectors for detector %s, returning null pointer",det));
+ delete result;
+ return 0x0;
+ }
+ if (result->GetFieldCount() != 3){
+ Log("SHUTTLE",Form("ERROR: not all the required fields are there for the LTU configuration for detector %s (only %d found), returning a null pointer",det, result->GetFieldCount()));
+ delete result;
+ return 0x0;
+ }
+ TSQLRow* row = result->Next();
+ if (!row){
+ Printf("ERROR: Could not receive logbook_detectors data, returning null pointer");
+ delete result;
+ return 0x0;
+ }
+ TString* ltuConfigString = new TString[3];
+
+ ltuConfigString[0] = row->GetField(0);
+ ltuConfigString[1] = row->GetField(1);
+ ltuConfigString[2] = row->GetField(2);
+ return ltuConfigString;
+
+}