]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - SHUTTLE/AliShuttle.cxx
Update master to aliroot
[u/mrichter/AliRoot.git] / SHUTTLE / AliShuttle.cxx
index a804d77acaec0abd32bdc330a75730790ed72698..75d96728b96b0db9b21440ca0c54ac32fb5b43ef 100644 (file)
@@ -28,6 +28,7 @@
 // For detSpec is used the alias name.
 //
 
+#include <stdexcept>
 #include "AliShuttle.h"
 
 #include "AliCDBManager.h"
@@ -67,6 +68,7 @@
 #include <sys/wait.h>
 
 #include <signal.h>
+using namespace std;
 
 ClassImp(AliShuttle)
 
@@ -96,9 +98,9 @@ fOutputRedirected(kFALSE)
        //
 
        if (!fConfig->IsValid()) AliFatal("********** !!!!! Invalid configuration !!!!! **********");
-       for(int iSys=0;iSys<4;iSys++) {
+       for(int iSys=0;iSys<5;iSys++) {
                fServer[iSys]=0;
-               if (iSys < 3)
+               if (iSys < 4)
                        fFXSlist[iSys].SetOwner(kTRUE);
        }
        fPreprocessorMap.SetOwner(kTRUE);
@@ -117,7 +119,7 @@ AliShuttle::~AliShuttle()
        //
 
        fPreprocessorMap.DeleteAll();
-       for(int iSys=0;iSys<4;iSys++)
+       for(int iSys=0;iSys<5;iSys++)
                if(fServer[iSys]) {
                        fServer[iSys]->Close();
                        delete fServer[iSys];
@@ -357,6 +359,7 @@ Int_t AliShuttle::StoreOCDB(const TString& gridURI)
                        Form("StoreOCDB - cannot activate main %s storage", type));
                return -2;
        }
+       gridSto->SetMirrorSEs(fgkMirrorSEs.Data());
 
        gridIds = gridSto->GetQueryCDBList();
 
@@ -489,7 +492,7 @@ Bool_t AliShuttle::CleanReferenceStorage(const char* detector)
        
        if (!dirList) return kTRUE;
                        
-       if (dirList->GetEntries() < 3) 
+       if (dirList->GetEntries() < 3) // to be changed to 4?
        {
                delete dirList;
                return kTRUE;
@@ -950,8 +953,12 @@ AliShuttleStatus* AliShuttle::ReadShuttleStatus()
        }
 
        Int_t path1 = GetCurrentRun()/10000;
-       fStatusEntry = AliCDBManager::Instance()->GetStorage(GetLocalCDB())
-               ->Get(Form("/SHUTTLE/%s/%d", fCurrentDetector.Data(), path1), GetCurrentRun());
+       try{
+                fStatusEntry = AliCDBManager::Instance()->GetStorage(GetLocalCDB())
+                        ->Get(Form("/SHUTTLE/%s/%d", fCurrentDetector.Data(), path1), GetCurrentRun());
+        } catch(std::exception& x) {
+                AliInfo(TString::Format("%s",x.what()));
+        }
 
        if (!fStatusEntry) return 0;
        fStatusEntry->SetOwner(1);
@@ -1083,8 +1090,8 @@ Bool_t AliShuttle::ContinueProcessing()
                dynamic_cast<AliPreprocessor*> (fPreprocessorMap.GetValue(fCurrentDetector));
        if (!aPreprocessor)
        {
-               Log("SHUTTLE", Form("ContinueProcessing - %s: no preprocessor registered", fCurrentDetector.Data()));
-               return kFALSE;
+               Log("SHUTTLE", Form("ContinueProcessing - %s: no preprocessor registered", fCurrentDetector.Data()));
+               return kFALSE;
        }
 
        AliShuttleLogbookEntry::Status entryStatus =
@@ -1106,7 +1113,7 @@ Bool_t AliShuttle::ContinueProcessing()
                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
@@ -1114,7 +1121,7 @@ Bool_t AliShuttle::ContinueProcessing()
                        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()));
                }
        }
 
@@ -1406,7 +1413,7 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry)
                Log("SHUTTLE", Form("\t\t\t****** run %d - %s: START  ******",
                                                GetCurrentRun(), aDetector->GetName()));
 
-               for(Int_t iSys=0;iSys<3;iSys++) fFXSCalled[iSys]=kFALSE;
+               for(Int_t iSys=0;iSys<4;iSys++) fFXSCalled[iSys]=kFALSE;
                
                Int_t initialMem = GetMem(getpid());
                Log("SHUTTLE", Form("Memory consumption before forking is %d", initialMem));
@@ -1432,7 +1439,10 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry)
                        {
                                Long_t expiredTime = time(0) - begin;
 
-                               if (expiredTime > fConfig->GetPPTimeOut())
+                               // the run-dependent timeout is the timeout from the configuration plus a twentieth of
+                               // the run duration, e.g. 3 additional minutes for 1h run or 1/2h for a 10h run
+                               Int_t runDepTimeOut = fConfig->GetPPTimeOut() + (GetCurrentEndTime() - GetCurrentStartTime()) * 0.05;
+                               if (expiredTime > runDepTimeOut)
                                {
                                         TString logMsg;
                                        AliShuttleStatus *currentStatus = ReadShuttleStatus();
@@ -1443,7 +1453,7 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry)
                                                // 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: %d seconds. Killing... and setting status to DCSError.",
+                                               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;
                                        }
@@ -1451,7 +1461,7 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry)
                                        {
                                                // 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;
                                        }
@@ -1460,7 +1470,7 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry)
                                                // 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;
                                        }
@@ -1468,7 +1478,7 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry)
                                        {
                                                // 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);
                                        }
                                
@@ -1499,7 +1509,7 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry)
                                        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();
                                        }
@@ -1555,6 +1565,9 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry)
                                        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;
@@ -1612,7 +1625,7 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry)
                                                GetCurrentRun(), aDetector->GetName()));
                        }
 
-                       for (UInt_t iSys=0; iSys<3; iSys++)
+                       for (UInt_t iSys=0; iSys<4; iSys++)
                        {
                                if (fFXSCalled[iSys]) fFXSlist[iSys].Clear();
                        }
@@ -1879,13 +1892,13 @@ void AliShuttle::CountOpenRuns()
        SendAlive();
        
        // check connection, in case connect
-       if (!Connect(3)) 
+       if (!Connect(4)) 
                return;
 
        TString sqlQuery;
        sqlQuery = Form("select count(*) from %s where shuttle_done=0", fConfig->GetShuttlelbTable());
        
-       TSQLResult* aResult = fServer[3]->Query(sqlQuery);
+       TSQLResult* aResult = fServer[4]->Query(sqlQuery);
        if (!aResult) {
                AliError(Form("Can't execute query <%s>!", sqlQuery.Data()));
                return;
@@ -1936,12 +1949,12 @@ Bool_t AliShuttle::QueryShuttleLogbook(const char* whereClause,
        entries.SetOwner(1);
 
        // check connection, in case connect
-       if (!Connect(3)) return kFALSE;
+       if (!Connect(4)) return kFALSE;
 
        TString sqlQuery;
        sqlQuery = Form("select * from %s %s order by run", fConfig->GetShuttlelbTable(), whereClause);
 
-       TSQLResult* aResult = fServer[3]->Query(sqlQuery);
+       TSQLResult* aResult = fServer[4]->Query(sqlQuery);
        if (!aResult) {
                AliError(Form("Can't execute query <%s>!", sqlQuery.Data()));
                return kFALSE;
@@ -1956,7 +1969,7 @@ Bool_t AliShuttle::QueryShuttleLogbook(const char* whereClause,
        }
 
        // TODO Check field count!
-       const UInt_t nCols = 26;
+       const UInt_t nCols = 27;
        if (aResult->GetFieldCount() != (Int_t) nCols) {
                Log("SHUTTLE", "Invalid SQL result field number!");
                delete aResult;
@@ -1997,13 +2010,13 @@ AliShuttleLogbookEntry* AliShuttle::QueryRunParameters(Int_t run)
        //
 
        // check connection, in case connect
-       if (!Connect(3))
+       if (!Connect(4))
                return 0;
 
        TString sqlQuery;
        sqlQuery.Form("select * from %s where run=%d", fConfig->GetDAQlbTable(), run);
 
-       TSQLResult* aResult = fServer[3]->Query(sqlQuery);
+       TSQLResult* aResult = fServer[4]->Query(sqlQuery);
        if (!aResult) {
                Log("SHUTTLE", Form("Can't execute query <%s>!", sqlQuery.Data()));
                return 0;
@@ -2043,6 +2056,8 @@ AliShuttleLogbookEntry* AliShuttle::QueryRunParameters(Int_t run)
        Bool_t ecsSuccess = entry->GetECSSuccess();
        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);
@@ -2059,21 +2074,27 @@ AliShuttleLogbookEntry* AliShuttle::QueryRunParameters(Int_t run)
                        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") {
-                                       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;
+                               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 {
-                                               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;
+                                               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;
+                                               }
                                        }
                                }
                        }
@@ -2119,19 +2140,25 @@ TMap* AliShuttle::GetValueSet(const char* host, Int_t port, const TSeqCollection
        AliDCSClient client(host, port, fTimeout, fRetries, multiSplit);
 
        TMap* result = 0;
+       UInt_t startQuery = GetStartTimeDCSQuery();
+       UInt_t endQuery = GetEndTimeDCSQuery();
+       if (fCurrentDetector == "GRP" && (endQuery - startQuery) <= 120) { // enlarging DCS query for GRP when a run is shorter than 2 minutes (i.e. the time of forced archival of GRP DPs)
+         Log(fCurrentDetector.Data(), Form("GetValueSet: run lasting less than 120 seconds, enlarging DCS window for DPs retrival to 130 s"));
+         startQuery = endQuery - 130; // we add 130 s to be sure that there is something (even if the archival is forced after 120 s)
+       }
+
        if (type == kAlias)
        {
                //result = client.GetAliasValues(entries, GetCurrentStartTime()-offset, 
                //      GetCurrentEndTime()+offset);
-               result = client.GetAliasValues(entries, GetStartTimeDCSQuery(), 
-                       GetEndTimeDCSQuery());
+
+               result = client.GetAliasValues(entries, startQuery, endQuery);         
        } 
        else if (type == kDP)
        {
                //result = client.GetDPValues(entries, GetCurrentStartTime()-offset, 
                //      GetCurrentEndTime()+offset);
-                       result = client.GetDPValues(entries, GetStartTimeDCSQuery(), 
-                       GetEndTimeDCSQuery());
+                       result = client.GetDPValues(entries, startQuery, endQuery);
        }
 
        if (result == 0)
@@ -2183,7 +2210,7 @@ const char* AliShuttle::GetFile(Int_t system, const char* detector,
        TString whereClause = Form("run=%d and detector=\"%s\" and fileId=\"%s\"",
                                                                GetCurrentRun(), detector, id);
 
-       if (system == kDAQ)
+       if (system == kDAQ || system == kDQM)
        {
                whereClause += Form(" and DAQsource=\"%s\"", source);
        }
@@ -2422,7 +2449,7 @@ TList* AliShuttle::GetFileSources(Int_t system, const char* detector, const char
        }
 
        TString sourceName = "";
-       if (system == kDAQ)
+       if (system == kDAQ || system == kDQM)
        {
                sourceName = "DAQsource";
        } else if (system == kHLT)
@@ -2581,7 +2608,7 @@ Bool_t AliShuttle::Connect(Int_t system)
 
        TString dbHost, dbUser, dbPass, dbName;
 
-       if (system < 3) // FXS db servers
+       if (system < 4) // FXS db servers
        {
                dbHost = Form("mysql://%s:%d", fConfig->GetFXSdbHost(system), fConfig->GetFXSdbPort(system));
                dbUser = fConfig->GetFXSdbUser(system);
@@ -2596,8 +2623,8 @@ Bool_t AliShuttle::Connect(Int_t system)
        }
 
        fServer[system] = TSQLServer::Connect(dbHost.Data(), dbUser.Data(), dbPass.Data());
-       if (!fServer[system] || !fServer[system]->IsConnected()) {
-               if(system < 3)
+               if (!fServer[system] || !fServer[system]->IsConnected()) {
+               if(system < 4)
                {
                AliError(Form("Can't establish connection to FXS database for %s",
                                        AliShuttleInterface::GetSystemName(system)));
@@ -2620,8 +2647,11 @@ Bool_t AliShuttle::Connect(Int_t system)
                case kHLT:
                        aResult = fServer[kHLT]->GetTables(dbName.Data());
                        break;
+               case kDQM:
+                       aResult = fServer[kDQM]->GetTables(dbName.Data());
+                       break;
                default:
-                       aResult = fServer[3]->GetTables(dbName.Data());
+                       aResult = fServer[4]->GetTables(dbName.Data());
                        break;
        }
 
@@ -2638,7 +2668,7 @@ Bool_t AliShuttle::UpdateTable()
 
        Bool_t result = kTRUE;
 
-       for (UInt_t system=0; system<3; system++)
+       for (UInt_t system=0; system<4; system++)
        {
                if(!fFXSCalled[system]) continue;
 
@@ -2671,7 +2701,7 @@ Bool_t AliShuttle::UpdateTable()
                        const char* source = ((TObjString*) aFXSarray->At(1))->GetName();
 
                        TString whereClause;
-                       if (system == kDAQ)
+                       if (system == kDAQ || system == kDQM)
                        {
                                whereClause = Form("where run=%d and detector=\"%s\" and fileId=\"%s\" and DAQsource=\"%s\";",
                                                        GetCurrentRun(), fCurrentDetector.Data(), fileId, source);
@@ -2689,8 +2719,8 @@ Bool_t AliShuttle::UpdateTable()
 
                        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()));
 
@@ -2723,7 +2753,7 @@ Bool_t AliShuttle::UpdateTableSkippedCase(const char* detector)
 
        TString detName(detector);
 
-       for (UInt_t system=0; system<3; system++)
+       for (UInt_t system=0; system<4; system++)
        {
 
                // check connection, in case connect
@@ -2745,8 +2775,8 @@ Bool_t AliShuttle::UpdateTableSkippedCase(const char* detector)
 
                //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()));
 
@@ -2775,7 +2805,7 @@ Bool_t AliShuttle::UpdateTableFailCase()
 
        Bool_t result = kTRUE;
 
-       for (UInt_t system=0; system<3; system++)
+       for (UInt_t system=0; system<4; system++)
        {
                // check connection, in case connect
                if (!Connect(system))
@@ -2794,8 +2824,8 @@ Bool_t AliShuttle::UpdateTableFailCase()
                                                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()));
 
@@ -2824,7 +2854,7 @@ Bool_t AliShuttle::UpdateShuttleLogbook(const char* detector, const char* status
        //
 
        // check connection, in case connect
-       if(!Connect(3)){
+       if(!Connect(4)){
                Log("SHUTTLE", "UpdateShuttleLogbook - Couldn't connect to DAQ Logbook.");
                return kFALSE;
        }
@@ -2870,7 +2900,7 @@ Bool_t AliShuttle::UpdateShuttleLogbook(const char* detector, const char* status
 
        // Query execution
        TSQLResult* aResult;
-       aResult = dynamic_cast<TSQLResult*> (fServer[3]->Query(sqlQuery));
+       aResult = dynamic_cast<TSQLResult*> (fServer[4]->Query(sqlQuery));
        if (!aResult) {
                Log("SHUTTLE", Form("UpdateShuttleLogbook - Can't execute query <%s>", sqlQuery.Data()));
                return kFALSE;
@@ -2938,7 +2968,7 @@ const char* AliShuttle::GetLHCPeriod() const
 }
 
 //______________________________________________________________________________________________
-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
@@ -2965,7 +2995,7 @@ void AliShuttle::Log(const char* detector, const char* 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)
@@ -3343,6 +3373,7 @@ Bool_t AliShuttle::SendMail(EMailTarget target, Int_t system)
                if (system == kDAQ) sys="DAQ";
                else if (system == kDCS) sys="DCS";
                else if (system == kHLT) sys="HLT";
+               else if (system == kDQM) sys="DQM";
                else return kFALSE;
                body = Form("Dear  %s FXS experts, \n\n",sys.Data());
                body += Form("SHUTTLE couldn\'t retrieve data from the FXS for detector %s "
@@ -3466,12 +3497,12 @@ const char* AliShuttle::GetTriggerConfiguration()
        // Receives the trigger configuration from the DAQ logbook for the current run
        
        // check connection, if needed reconnect
-       if (!Connect(3)) 
+       if (!Connect(4)) 
                return 0;
 
        TString sqlQuery;
        sqlQuery.Form("SELECT configFile FROM logbook_trigger_config WHERE run = %d", GetCurrentRun());
-       TSQLResult* result = fServer[3]->Query(sqlQuery);
+       TSQLResult* result = fServer[4]->Query(sqlQuery);
        if (!result)
        {
                Log("SHUTTLE", Form("ERROR: Can't execute query <%s>!", sqlQuery.Data()));
@@ -3513,12 +3544,12 @@ 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)) 
+       if (!Connect(4)) 
                return 0;
 
        TString sqlQuery;
        sqlQuery.Form("SELECT alignmentFile FROM logbook_trigger_config WHERE run = %d", GetCurrentRun());
-       TSQLResult* result = fServer[3]->Query(sqlQuery);
+       TSQLResult* result = fServer[4]->Query(sqlQuery);
        if (!result)
        {
                Log("SHUTTLE", Form("ERROR: Can't execute query <%s>!", sqlQuery.Data()));
@@ -3560,12 +3591,12 @@ const char* AliShuttle::GetTriggerDetectorMask()
        // Receives the trigger detector mask from DAQ logbook
        
        // check connection, if needed reconnect
-       if (!Connect(3)) 
+       if (!Connect(4)) 
                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);
+       TSQLResult* result = fServer[4]->Query(sqlQuery);
        if (!result)
        {
                Log("SHUTTLE", Form("ERROR: Can't execute query <%s>!", sqlQuery.Data()));
@@ -3637,22 +3668,14 @@ Bool_t AliShuttle::TouchFile()
        TString dir;
        dir.Form("%s%d/SHUTTLE_DONE", fConfig->GetAlienPath(), GetCurrentYear());
        // checking whether directory for touch command exists
-       TString commandLs;
-       commandLs.Form("ls %s",dir.Data());
-       TGridResult *resultLs = dynamic_cast<TGridResult*>(gGrid->Command(commandLs));
-       if (!resultLs){
-               Log("SHUTTLE",Form("No result for %s command, returning without touching",commandLs.Data()));
+        TGridResult* resultLs = gGrid->Ls(dir.Data());
+       if (!resultLs){ // unfortunately we don't get this for ls of a non existing dir
+               Log("SHUTTLE",Form("No result for \"Ls(\"%s\")\", returning without touching", dir.Data()));
                return kFALSE;
        }
-       TMap *mapLs = dynamic_cast<TMap*>(resultLs->At(0));
-       if (!mapLs){
-               Log("SHUTTLE",Form("No map for %s command, returning without touching",commandLs.Data()));
-               delete resultLs;
-               resultLs = 0x0;
-               return kFALSE;
-       }
-       TObjString *valueLsPath = dynamic_cast<TObjString*>(mapLs->GetValue("path"));
-       if (!valueLsPath || (valueLsPath->GetString()).CompareTo(dir)!=1){ 
+
+        if ( resultLs->GetEntries() == 1 && !resultLs->GetFileName(0) ) {
+          // this is what we currently get for ls of a non existing dir
                Log("SHUTTLE",Form("No directory %s found, creating it",dir.Data()));
 
                // creating the directory
@@ -3673,39 +3696,63 @@ Bool_t AliShuttle::TouchFile()
        delete resultLs;
        resultLs = 0x0;
 
-       TString command;
-       command.Form("touch %s/%i", dir.Data(), GetCurrentRun());
-       Log("SHUTTLE", Form("Creating entry in file catalog: %s", command.Data()));
-       TGridResult *resultTouch = dynamic_cast<TGridResult*>(gGrid->Command(command));
-       if (!resultTouch){
-               Log("SHUTTLE",Form("No result for touching command, returning without touching for run %i",GetCurrentRun()));
+        // Before trying to touch, check that the file is not already there (the touch would fail forever, leaving the run in pending)
+        TString lsFileCommand;
+        lsFileCommand.Form("ls %s/%i", dir.Data(), GetCurrentRun());
+        TGridResult *resultLsFile = dynamic_cast<TGridResult*>(gGrid->Command(lsFileCommand));
+       if (!resultLsFile){
+               Log("SHUTTLE",Form("No result for file ls command, returning without touching for run %i",GetCurrentRun()));
                return kFALSE;
        }
-       TMap *mapTouch = dynamic_cast<TMap*>(resultTouch->At(0));
-       if (!mapTouch){
-               Log("SHUTTLE",Form("No map for touching command, returning without touching for run %i",GetCurrentRun()));
-               delete resultTouch;
-               resultTouch = 0x0; 
+        TMap *mapLsFile = dynamic_cast<TMap*>(resultLsFile->At(0));
+       if (!mapLsFile){
+               Log("SHUTTLE",Form("No map for file ls command, returning without touching for run %i",GetCurrentRun()));
+               delete resultLsFile;
+               resultLsFile = 0x0; 
                return kFALSE;
        }
-       TObjString *valueTouch = dynamic_cast<TObjString*>(mapTouch->GetValue("__result__"));
-       if (!valueTouch){
-               Log("SHUTTLE",Form("No value for \"__result__\" key set in the map for touching command, returning without touching for run %i",GetCurrentRun()));
-               delete resultTouch;
-               resultTouch = 0x0; 
-               return kFALSE;
-       }
-       if (valueTouch->GetString()!="1"){
-               Log("SHUTTLE",Form("Failing the touching command, returning without touching for run %i",GetCurrentRun()));
-               delete resultTouch;
-               resultTouch = 0x0; 
-               return kFALSE;
-       }
-       delete resultTouch;
-       resultTouch = 0x0; 
-       Log("SHUTTLE", "Sucessfully touched the file");
-       return kTRUE;
+       TObjString *valueLsFile = dynamic_cast<TObjString*>(mapLsFile->GetValue("name"));
+       if (valueLsFile){
+               Log("SHUTTLE",Form("\"name\" key set in the map for file ls command. Touchfile for run %i already there.",GetCurrentRun()));
+                Log("SHUTTLE", "The file was already there, did not touch it.");
+        }else{
+                TString command;
+                command.Form("touch %s/%i", dir.Data(), GetCurrentRun());
+                Log("SHUTTLE", Form("Creating entry in file catalog: %s", command.Data()));
+                TGridResult *resultTouch = dynamic_cast<TGridResult*>(gGrid->Command(command));
+                if (!resultTouch){
+                        Log("SHUTTLE",Form("No result for touching command, returning without touching for run %i",GetCurrentRun()));
+                        return kFALSE;
+                }
+                TMap *mapTouch = dynamic_cast<TMap*>(resultTouch->At(0));
+                if (!mapTouch){
+                        Log("SHUTTLE",Form("No map for touching command, returning without touching for run %i",GetCurrentRun()));
+                        delete resultTouch;
+                        resultTouch = 0x0; 
+                        return kFALSE;
+                }
+                TObjString *valueTouch = dynamic_cast<TObjString*>(mapTouch->GetValue("__result__"));
+                if (!valueTouch){
+                        Log("SHUTTLE",Form("No value for \"__result__\" key set in the map for touching command, returning without touching for run %i",GetCurrentRun()));
+                        delete resultTouch;
+                        resultTouch = 0x0; 
+                        return kFALSE;
+                }
+                if (valueTouch->GetString()!="1"){
+                        Log("SHUTTLE",Form("Failing the touching command, returning without touching for run %i",GetCurrentRun()));
+                        delete resultTouch;
+                        resultTouch = 0x0; 
+                        return kFALSE;
+                }
+                delete resultLsFile;
+                resultLsFile = 0x0; 
+                delete resultTouch;
+                resultTouch = 0x0;
+                Log("SHUTTLE", "Sucessfully touched the file");
+        }
+        return kTRUE;
 }
+
 //______________________________________________________________________________________________
 UInt_t AliShuttle::GetStartTimeDCSQuery()
 {
@@ -3724,4 +3771,64 @@ UInt_t AliShuttle::GetEndTimeDCSQuery()
 
        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(4)) 
+               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[4]->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;
+
+}