]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - SHUTTLE/TestShuttle/AliTestShuttle.cxx
Adding check on trigger configuration string length.
[u/mrichter/AliRoot.git] / SHUTTLE / TestShuttle / AliTestShuttle.cxx
index 1459bb3ee437c4699b88ba33aa1b623c010a608c..c3ac78a15b6e93a4b3c3e0e33b79ccc2f37928a6 100644 (file)
 
 /*
 $Log$
+Revision 1.14  2007/08/06 12:25:47  acolla
+Function Bool_t GetHLTStatus added to preprocessor. It returns the status of HLT
+read from the run logbook.
+TestShuttle setup updated.
+TRD data point configuration updated.
+
+Revision 1.13  2007/05/30 06:35:21  jgrosseo
+Adding functionality to the Shuttle/TestShuttle:
+o) Function to retrieve list of sources from a given system (GetFileSources with id=0)
+o) Function to retrieve list of IDs for a given source      (GetFileIDs)
+These functions are needed for dealing with the tag files that are saved for the GRP preprocessor
+Example code has been added to the TestProcessor in TestShuttle
+
+Revision 1.12  2007/04/27 07:06:48  jgrosseo
+GetFileSources returns empty list in case of no files, but successful query
+No mails sent in testmode
+
+Revision 1.11  2007/04/04 10:33:36  jgrosseo
+1) Storing of files to the Grid is now done _after_ your preprocessors succeeded. This is transparent, which means that you can still use the same functions (Store, StoreReferenceData) to store files to the Grid. However, the Shuttle first stores them locally and transfers them after the preprocessor finished. The return code of these two functions has changed from UInt_t to Bool_t which gives you the success of the storing.
+In case of an error with the Grid, the Shuttle will retry the storing later, the preprocessor does not need to be run again.
+
+2) The meaning of the return code of the preprocessor has changed. 0 is now success and any other value means failure. This value is stored in the log and you can use it to keep details about the error condition.
+
+3) New function StoreReferenceFile to _directly_ store a file (without opening it) to the reference storage.
+
+4) The memory usage of the preprocessor is monitored. If it exceeds 2 GB it is terminated.
+
+5) New function AliPreprocessor::ProcessDCS(). If you do not need to have DCS data in all cases, you can skip the processing by implemting this function and returning kFALSE under certain conditions. E.g. if there is a certain run type.
+If you always need DCS data (like before), you do not need to implement it.
+
+6) The run type has been added to the monitoring page
+
+Revision 1.10  2007/02/28 10:41:01  acolla
+Run type field added in SHUTTLE framework. Run type is read from "run type" logbook and retrieved by
+AliPreprocessor::GetRunType() function.
+Added some ldap definition files.
+
 Revision 1.8  2007/02/13 11:22:25  acolla
 Shuttle getters and setters of main/local OCDB/Reference storages, temp and log
 folders moved to AliShuttleInterface
@@ -88,6 +125,7 @@ some docs added
 #include <TList.h>
 #include <TObjString.h>
 #include <TSystem.h>
+#include <TTimeStamp.h>
 
 ClassImp(AliTestShuttle)
 
@@ -98,7 +136,7 @@ AliTestShuttle::AliTestShuttle(Int_t run, UInt_t startTime, UInt_t endTime) :
   fEndTime(endTime),
   fInputFiles(0),
   fRunParameters(0),
-  fRunTypeMap(0),
+  fRunType(),
   fPreprocessors(0),
   fDcsAliasMap(0)
 {
@@ -106,12 +144,10 @@ AliTestShuttle::AliTestShuttle(Int_t run, UInt_t startTime, UInt_t endTime) :
 
   fInputFiles = new TMap;
   fRunParameters = new TMap;
-  fRunTypeMap = new TMap;
   fPreprocessors = new TObjArray;
 
   fInputFiles->SetOwner(1);
   fRunParameters->SetOwner(1);
-  fRunTypeMap->SetOwner(1);
   fPreprocessors->SetOwner(1);
 }
 
@@ -126,9 +162,6 @@ AliTestShuttle::~AliTestShuttle()
   delete fRunParameters;
   fRunParameters = 0;
 
-  delete fRunTypeMap;
-  fRunTypeMap = 0;
-
   delete fPreprocessors;
   fPreprocessors = 0;
 
@@ -137,7 +170,7 @@ AliTestShuttle::~AliTestShuttle()
 }
 
 //______________________________________________________________________________________________
-UInt_t AliTestShuttle::Store(const AliCDBPath& path, TObject* object, AliCDBMetaData* metaData,
+Bool_t AliTestShuttle::Store(const AliCDBPath& path, TObject* object, AliCDBMetaData* metaData,
                                Int_t validityStart, Bool_t validityInfinite)
 {
   // Stores the CDB object
@@ -165,7 +198,7 @@ UInt_t AliTestShuttle::Store(const AliCDBPath& path, TObject* object, AliCDBMeta
 }
 
 //______________________________________________________________________________________________
-UInt_t AliTestShuttle::StoreReferenceData(const AliCDBPath& path, TObject* object, AliCDBMetaData* metaData)
+Bool_t AliTestShuttle::StoreReferenceData(const AliCDBPath& path, TObject* object, AliCDBMetaData* metaData)
 {
   // Stores the object as reference data
   // This function should be called at the end of the preprocessor cycle
@@ -178,6 +211,131 @@ UInt_t AliTestShuttle::StoreReferenceData(const AliCDBPath& path, TObject* objec
   return AliCDBManager::Instance()->GetStorage(fgkMainRefStorage)->Put(object, id, metaData);
 }
 
+//______________________________________________________________________________________________
+Bool_t AliTestShuttle::StoreReferenceFile(const char* detector, const char* localFile, const char* gridFileName)
+{
+       //
+       // Stores reference file directly (without opening it). 
+       //
+       // This implementation just stores it on the local disk, the full AliShuttle 
+       // puts it to the Grid FileCatalog
+       
+       AliCDBManager* man = AliCDBManager::Instance();
+       AliCDBStorage* sto = man->GetStorage(fgkLocalRefStorage);
+       
+       TString localBaseFolder = sto->GetBaseFolder();
+       
+       TString targetDir = GetRefFilePrefix(localBaseFolder.Data(), detector); 
+       
+       return CopyFileLocally(targetDir, localFile, gridFileName);
+}
+
+//______________________________________________________________________________________________
+Bool_t AliTestShuttle::StoreRunMetadataFile(const char* localFile, const char* gridFileName)
+{
+       //
+       // Stores Run metadata file to the Grid, in the run folder
+       //
+       // Only GRP can call this function.
+       
+       AliCDBManager* man = AliCDBManager::Instance();
+       AliCDBStorage* sto = man->GetStorage(fgkLocalRefStorage);
+       
+       TString localBaseFolder = sto->GetBaseFolder();
+       
+       // Build Run level folder
+       // folder = /alice/data/year/lhcPeriod/runNb/Raw
+       
+       TTimeStamp startTime(fStartTime);
+               
+       TString year =  Form("%d",startTime.GetDate());
+       year = year(0,4);
+               
+       TString lhcPeriod = GetRunParameter("LHCperiod");
+       
+       if (lhcPeriod.Length() == 0) 
+       {
+               Log("SHUTTLE","StoreRunMetaDataFile - LHCPeriod not found in logbook!");
+               return 0;
+       }
+       
+       // TODO: currently SHUTTLE cannot write in /alice/data/ !!!!!
+       //TString targetDir = Form("%s/GRP/RunMetadata/alice/data/%s/%s/%d/Raw", 
+       //                      localBaseFolder.Data(), year.Data(), 
+       //                      lhcPeriod.Data(), fRun);
+       
+       TString targetDir = Form("%s/GRP/RunMetadata/alice/simulation/%s/%s/%d/Raw", 
+                               localBaseFolder.Data(), year.Data(), 
+                               lhcPeriod.Data(), fRun);
+                                       
+       return CopyFileLocally(targetDir, localFile, gridFileName);
+}
+
+//______________________________________________________________________________________________
+Bool_t AliTestShuttle::CopyFileLocally(TString& targetDir, const char* localFile, const char* gridFileName)
+{
+       //
+       // Stores file locally. Called by StoreReferenceFile and StoreRunMetadataFile
+       //
+       
+       //try to open folder, if it does not exist
+       void* dir = gSystem->OpenDirectory(targetDir.Data());
+       if (dir == NULL) {
+               if (gSystem->mkdir(targetDir.Data(), kTRUE)) {
+                       Log("SHUTTLE", Form("StoreFileLocally - Can't open directory <%s>", targetDir.Data()));
+                       return kFALSE;
+               }
+
+       } else {
+               gSystem->FreeDirectory(dir);
+       }
+
+       TString target = Form("%s/%s", targetDir.Data(), gridFileName);
+       
+       Int_t result = gSystem->GetPathInfo(localFile, 0, (Long64_t*) 0, 0, 0);
+       if (result)
+       {
+               Log("SHUTTLE", Form("StoreFileLocally - %s does not exist", localFile));
+               return kFALSE;
+       }
+
+       result = gSystem->CopyFile(localFile, target);
+
+       if (result == 0)
+       {
+               Log("SHUTTLE", Form("StoreFileLocally - File %s stored locally to %s", localFile, target.Data()));
+               return kTRUE;
+       }
+       else
+       {
+               Log("SHUTTLE", Form("StoreFileLocally - Could not store file %s to %s!. Error code = %d", 
+                               localFile, target.Data(), result));
+               return kFALSE;
+       }       
+
+
+
+}
+
+//______________________________________________________________________________________________
+const char* AliTestShuttle::GetRefFilePrefix(const char* base, const char* detector)
+{
+       //
+       // Get folder name of reference files 
+       //
+
+       TString offDetStr(GetOfflineDetName(detector));
+       static TString dir;
+       if (offDetStr == "ITS" || offDetStr == "MUON" || offDetStr == "PHOS")
+       {
+               dir.Form("%s/%s/%s", base, offDetStr.Data(), detector);
+       } else {
+               dir.Form("%s/%s", base, offDetStr.Data());
+       }
+       
+       return dir.Data();
+}
+
 //______________________________________________________________________________________________
 const char* AliTestShuttle::GetFile(Int_t system, const char* detector, const char* id, const char* source)
 {
@@ -200,8 +358,10 @@ const char* AliTestShuttle::GetFile(Int_t system, const char* detector, const ch
     return 0;
   }
 
+  TObjString* fileName = 0;
   TPair* fileNamePair = dynamic_cast<TPair*> (sourceList->FindObject(source));
-  TObjString* fileName = dynamic_cast<TObjString*> (fileNamePair->Value());
+  if (fileNamePair)
+       fileName = dynamic_cast<TObjString*> (fileNamePair->Value());
   if (!fileName)
   {
     AliError(Form("Could not find files from source %s in %s with id %s",
@@ -221,29 +381,118 @@ TList* AliTestShuttle::GetFileSources(Int_t system, const char* detector, const
   // takes files from the local disks, files are passen in a TMap in the constructor
 
   TString key;
-  key.Form("%s-%s-%s", fkSystemNames[system], detector, id);
-  TPair* sourceListPair = dynamic_cast<TPair*> (fInputFiles->FindObject(key.Data()));
-  TMap* sourceList = 0;
-  if (sourceListPair)
-    sourceList = dynamic_cast<TMap*> (sourceListPair->Value());
-  if (!sourceList)
+  if (id)
+    key.Form("%s-%s-%s", fkSystemNames[system], detector, id);
+  else
+    key.Form("%s-%s", fkSystemNames[system], detector);
+  
+  TList* list = new TList;
+  
+  TIterator* iter = fInputFiles->MakeIterator();
+  TObject* obj = 0;
+  while ((obj = iter->Next()))
   {
-    AliError(Form("Could not find any file in %s with id %s (%s)", fkSystemNames[system], id, key.Data()));
-    return 0;
+       TObjString* objStr = dynamic_cast<TObjString*> (obj);
+       if (objStr)
+       {
+               Bool_t found = kFALSE;
+               if (id)
+               {
+                       found = (objStr->String().CompareTo(key) == 0);
+               }
+               else
+                       found = objStr->String().BeginsWith(key);
+               
+               if (found)
+               {
+                       TPair* sourceListPair = dynamic_cast<TPair*> (fInputFiles->FindObject(objStr->String().Data()));
+                       TMap* sourceList = dynamic_cast<TMap*> (sourceListPair->Value());
+       
+                       TIterator* iter2 = sourceList->GetTable()->MakeIterator();
+                       TObject* obj2 = 0;
+                       while ((obj2 = iter2->Next()))
+                       {
+                               TPair* pair = dynamic_cast<TPair*> (obj2);
+                               if (pair)
+                               {
+                                       if (!list->FindObject(pair->Key()))
+                                               list->Add(new TObjString(pair->Key()->GetName()));
+                               }
+                       }
+                       
+                       delete iter2;
+               }
+       }
   }
+  
+  if (list->GetEntries() == 0)
+    AliInfo(Form("Could not find any file in %s with id %s (%s)", fkSystemNames[system], id, key.Data()));
+  
+  return list;
+}
 
-  TIterator* iter = sourceList->GetTable()->MakeIterator();
-  TObject* obj = 0;
+//______________________________________________________________________________________________
+TList* AliTestShuttle::GetFileIDs(Int_t system, const char* detector, const char* source)
+{
+  // Returns a list of ids in a given system that saved a file with the given source
+  //
+  // test implementation of GetFileSources
+  // takes files from the local disks, files are passen in a TMap in the constructor
+
+
+  TString key;
+  key.Form("%s-%s", fkSystemNames[system], detector);
+  
   TList* list = new TList;
+  
+  TIterator* iter = fInputFiles->MakeIterator();
+  TObject* obj = 0;
   while ((obj = iter->Next()))
   {
-    TPair* pair = dynamic_cast<TPair*> (obj);
-    if (pair)
-      list->Add(pair->Key());
+       TObjString* objStr = dynamic_cast<TObjString*> (obj);
+       if (objStr)
+       {
+               if (objStr->String().BeginsWith(key))
+               {
+                       Bool_t found = kFALSE;
+               
+                       TPair* sourceListPair = dynamic_cast<TPair*> (fInputFiles->FindObject(objStr->String().Data()));
+                       TMap* sourceList = dynamic_cast<TMap*> (sourceListPair->Value());
+       
+                       TIterator* iter2 = sourceList->GetTable()->MakeIterator();
+                       TObject* obj2 = 0;
+                       while ((obj2 = iter2->Next()))
+                       {
+                               TPair* pair = dynamic_cast<TPair*> (obj2);
+                               if (pair)
+                               {
+                                       if (strcmp(pair->Key()->GetName(), source) == 0)
+                                               found = kTRUE;
+                               }
+                       }
+                       
+                       delete iter2;
+                       
+                       if (found)
+                       {
+                               TObjArray* tokens = objStr->String().Tokenize("-");
+                               if (tokens->GetEntries() == 3)
+                               {
+                                       TObjString* id = dynamic_cast<TObjString*> (tokens->At(2));
+                                       if (id && !list->FindObject(id->String()))
+                                               list->Add(new TObjString(id->String()));
+                               }
+                               
+                               delete tokens;
+       
+                       }
+               }
+       }
   }
-
-  delete iter;
-
+  
+  if (list->GetEntries() == 0)
+    AliInfo(Form("Could not find any file in %s with source %s (%s)", fkSystemNames[system], source, key.Data()));
+  
   return list;
 }
 
@@ -259,8 +508,14 @@ void AliTestShuttle::Log(const char* detector, const char* message)
 //______________________________________________________________________________________________
 void AliTestShuttle::AddInputFile(Int_t system, const char* detector, const char* id, const char* source, const char* fileName)
 {
+  //
   // This function adds a file to the list of input files
-
+  // the list is stored in fInputFiles 
+  // fInputFiles: TMap (key -> value)
+  //    <system>-<detector>-<id> -> TMap (key -> value)
+  //                                <source> -> <filename>
+  //  
+  
   TString key;
   key.Form("%s-%s-%s", fkSystemNames[system], detector, id);
   TPair* sourceListPair = dynamic_cast<TPair*> (fInputFiles->FindObject(key.Data()));
@@ -292,7 +547,7 @@ Bool_t AliTestShuttle::AddInputCDBEntry(AliCDBEntry* entry)
 }
 
 //______________________________________________________________________________________________
-AliCDBEntry* AliTestShuttle::GetFromOCDB(const AliCDBPath& path)
+AliCDBEntry* AliTestShuttle::GetFromOCDB(const char* detector, const AliCDBPath& path)
 {
 // returns obiect from OCDB valid for current run
 
@@ -317,8 +572,11 @@ void AliTestShuttle::Process()
     AliPreprocessor* preprocessor = dynamic_cast<AliPreprocessor*> (fPreprocessors->At(i));
     if (preprocessor)
     {
-      preprocessor->Initialize(fRun, fStartTime, fEndTime);
-      preprocessor->Process(fDcsAliasMap);
+      if (preprocessor->ProcessRunType())
+      {
+        preprocessor->Initialize(fRun, fStartTime, fEndTime);
+        preprocessor->Process(fDcsAliasMap);
+      }
     }
   }
 }
@@ -353,37 +611,13 @@ void AliTestShuttle::AddInputRunParameter(const char* key, const char* value){
 }
 
 //______________________________________________________________________________________________
-void AliTestShuttle::AddInputRunType(const char* detCode, const char* runType){
-// set a run type (in reality it will be read from the "run type" logbook)
-
-       if (strcmp("DET", detCode) != 0)
-       {
-               if (GetDetPos(detCode) < 0)
-               {
-                       AliError(Form("Invalid detector name: %s", detCode));
-                       return;
-               }
-       }
-       TObjString* detObj = new TObjString(detCode);
-       if (fRunTypeMap->Contains(detCode)) {
-               AliWarning(Form("Detector %s already inserted: it will be replaced.", detCode));
-               delete fRunTypeMap->Remove(detObj);
-
-       }
-       fRunTypeMap->Add(detObj, new TObjString(runType));
-       AliDebug(2, Form("Number of detectors: %d", fRunTypeMap->GetEntries()));
-}
-
-//______________________________________________________________________________________________
-const char* AliTestShuttle::GetRunType(const char* detCode){
-// get a run parameter
+const char* AliTestShuttle::GetRunType()
+{
+       //
+       // get a run parameter
+       //
 
-       TObjString* value = dynamic_cast<TObjString*> (fRunTypeMap->GetValue(detCode));
-       if(!value) {
-               AliError(Form("Input run type not set for detector %s!", detCode));
-               return 0;
-       }
-       return value->GetName();
+       return fRunType.Data();
 }
 
 //______________________________________________________________________________________________
@@ -414,3 +648,12 @@ void AliTestShuttle::SetShuttleLogDir(const char* logDir)
        fgkShuttleLogDir = gSystem->ExpandPathName(logDir);
 }
 
+//______________________________________________________________________________________________
+const char* AliTestShuttle::GetTriggerConfiguration()
+{
+       //returns trigger configuration
+       if (fTriggerConfiguration.Length()>0){
+               return fTriggerConfiguration;
+       }
+       return NULL;
+}