ALIROOT-5433 Transition to CDHv3 in HLT
[u/mrichter/AliRoot.git] / HLT / rec / AliHLTMiscImplementation.cxx
index 3bf4acb..dc90047 100644 (file)
@@ -1,7 +1,7 @@
 // $Id$
 
 //**************************************************************************
-//* This file is property of and copyright by the ALICE HLT Project        * 
+//* This file is property of and copyright by the                          * 
 //* ALICE Experiment at CERN, All rights reserved.                         *
 //*                                                                        *
 //* Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no>        *
@@ -18,8 +18,9 @@
 
 /// @file   AliHLTMisc.cxx
 /// @author Matthias Richter
-/// @date   
-/// @brief  Miscellaneous methods for the HLT AliRoot integration
+/// @date   2009-07-07
+/// @brief  Implementation of various glue functions implemented in dynamically
+///         loaded libraries
 
 #include "AliHLTMiscImplementation.h"
 #include "AliHLTLogging.h"
 #include "AliRawReader.h"
 #include "AliRawEventHeaderBase.h"
 #include "AliTracker.h"
-#ifndef HAVE_NOT_ALIESDHLTDECISION
+#include "AliESDtrack.h"
 #include "AliESDHLTDecision.h"
-#endif //HAVE_NOT_ALIESDHLTDECISION
 #include "TGeoGlobalMagField.h"
 #include "AliHLTGlobalTriggerDecision.h"
 #include "TClass.h"
 #include "TStreamerInfo.h"
 #include "TObjArray.h"
+#include <stdexcept>
 
 /** ROOT macro for the implementation of ROOT specific class methods */
 ClassImp(AliHLTMiscImplementation);
@@ -109,7 +110,7 @@ int AliHLTMiscImplementation::GetCDBRunNo() const
   return -1;
 }
 
-AliCDBEntry* AliHLTMiscImplementation::LoadOCDBEntry(const char* path, int runNo, int version, int subVersion) const
+AliCDBEntry* AliHLTMiscImplementation::LoadOCDBEntry(const char* path, int runNo) const
 {
   // see header file for function documentation
   if (!path) return NULL;
@@ -122,57 +123,17 @@ AliCDBEntry* AliHLTMiscImplementation::LoadOCDBEntry(const char* path, int runNo
   }
   if (runNo<0) runNo=man->GetRun();
 
-  // check the cache first if no specific version required
-  if (version<0) {
-    const TMap* pCache=man->GetEntryCache();
-    TObject* pEntryObj=NULL;
-    if (pCache && (pEntryObj=pCache->GetValue(path))!=NULL) {
-      AliCDBEntry* pEntry=dynamic_cast<AliCDBEntry*>(pEntryObj);
-      if (pEntry) {
-       log.Logging(kHLTLogDebug, "AliHLTMiscImplementation::LoadOCDBEntry", "CDB handling", "using OCDB object %s from cache", path);
-       return pEntry;
-      } else {
-       log.Logging(kHLTLogError, "AliHLTMiscImplementation::LoadOCDBEntry", "CDB handling", "invalid OCDB object %s found in cache, not of type AliCDBEntry", path);
-      }
-    }
-  }
-
-  const char* uri=man->GetURI(path);
-  if (!uri) {
-    log.Logging(kHLTLogError, "AliHLTMiscImplementation::LoadOCDBEntry", "CDB handling", "can not find URI for CDB object \"%s\"", path);
-    return NULL;
-  }
-
-  AliCDBStorage* store = AliCDBManager::Instance()->GetStorage(uri);
-  if (!store) {
-    log.Logging(kHLTLogError, "AliHLTMiscImplementation::LoadOCDBEntry", "CDB handling", "can not find storage for URI \"%s\"", uri);
-    return NULL;
-  }
-
-  TString strUri=store->GetURI();
-  bool bIsGrid=strUri.BeginsWith("alien://");
-
-  int latest = store->GetLatestVersion(path, runNo);
-  if (latest<0) {
-    log.Logging(kHLTLogError, "AliHLTMiscImplementation::LoadOCDBEntry", "CDB handling", "Could not find an entry in the CDB for \"%s\".", path);
-    return NULL;
+  AliCDBEntry* entry=NULL;
+  try {
+    // exceptions for the loading of OCDB objects have been introduced in r61012 on
+    // Feb 20 2013. This allows to reduce this function to try and catch of AliCDBManager::Get
+    entry=man->Get(path, runNo);
   }
-  if (version<0) version=latest;
-
-  // OCDB objects on GRID have no sub version
-  if (subVersion<0 && !bIsGrid) subVersion = store->GetLatestSubVersion(path, runNo, version);
-  AliCDBEntry* entry=man->Get(path, runNo, version, subVersion);
-  if (entry) {
-    // there seems to be a problem with the caching of objects in the CDBManager
-    // regardless what version is specified it returns the object from the cache
-    AliCDBId id=entry->GetId();
-    if ((version<0 || id.GetVersion()==version) &&
-       (subVersion<0 || id.GetSubVersion()==subVersion)) {
-      // entry in the cache has the correct version
-      return entry;
-    }
+  catch (...) {
+    // ignore the exception, missing object can be a valid condition, and is handled
+    // downstream
   }
-  return store->Get(path, runNo, version, subVersion);
+  return entry;
 }
 
 TObject* AliHLTMiscImplementation::ExtractObject(AliCDBEntry* entry) const
@@ -197,42 +158,30 @@ int AliHLTMiscImplementation::CheckOCDBEntries(const TMap* const pMap) const
   AliCDBManager* man = AliCDBManager::Instance();
   if (!man) {
     ALIHLTERRORGUARD(1, "failed to access CDB manager");
-    return NULL;
+    return -ENOSYS;
   }
-  const TMap* pCache=man->GetEntryCache();
-
   Int_t runNo = GetCDBRunNo();
 
   TIterator* next=pMap->MakeIterator();
-  if (!next) return -ENOENT;
+  if (!next) return -EFAULT;
 
   TObject* pEntry=NULL;
   while ((pEntry=next->Next())) {
-    // check if already on cache
-    if (pCache && pCache->GetValue(pEntry->GetName())!=NULL) {
-      log.Logging(kHLTLogDebug, "AliHLTMiscImplementation::CheckOCDBEntries", "CDB handling", "found OCDB object %s on cache", pEntry->GetName());      
-      continue;
-    }
-
-    // check if the entry has specific storage
-    const char* uri=man->GetURI(pEntry->GetName());
-    if (!uri) {
-      log.Logging(kHLTLogError, "AliHLTMiscImplementation::CheckOCDBEntries", "CDB handling", "can not find URI for CDB object \"%s\"", pEntry->GetName());
-      return NULL;
-    }
-
-    AliCDBStorage* pStorage = AliCDBManager::Instance()->GetStorage(uri);
-    if (!pStorage) {
-      log.Logging(kHLTLogError, "AliHLTMiscImplementation::CheckOCDBEntries", "CDB handling", "can not find storage for URI \"%s\"", uri);
-      return NULL;
+    try {
+      // exceptions for the loading of OCDB objects have been introduced in r61012 on
+      // Feb 20 2013. This allows to reduce this function to try and catch of AliCDBManager::Get
+      man->Get(pEntry->GetName(), runNo);
     }
+    catch (...) {
+      // find out the storage for more details in the error message
+      AliCDBStorage* pStorage=NULL;
+      const char* uri=man->GetURI(pEntry->GetName());
+      if (uri) {
+       pStorage = AliCDBManager::Instance()->GetStorage(uri);
+      }
 
-    // GetLatestVersion is the only method to check the existence without potential AliFatal
-    if (pStorage->GetLatestVersion(pEntry->GetName(), runNo)<0) {
-      log.Logging(kHLTLogError, "AliHLTMiscImplementation::CheckOCDBEntries", "CDB handling", "can not find required OCDB object %s for run number %d in storage %s", pEntry->GetName(), runNo, pStorage->GetURI().Data());
+      log.Logging(kHLTLogError, "AliHLTMiscImplementation::CheckOCDBEntries", "CDB handling", "can not find required OCDB object %s for run number %d in storage %s", pEntry->GetName(), runNo, (pStorage!=NULL?pStorage->GetURI().Data():"<unavailable>"));
       iResult=-ENOENT;
-    } else {
-      log.Logging(kHLTLogDebug, "AliHLTMiscImplementation::CheckOCDBEntries", "CDB handling", "found required OCDB object %s for run number %d in storage %s", pEntry->GetName(), runNo, pStorage->GetURI().Data());
     }
   }
   delete next;
@@ -268,14 +217,20 @@ int AliHLTMiscImplementation::InitMagneticField() const
   return -ENOENT;
 }
 
-AliHLTUInt64_t AliHLTMiscImplementation::GetTriggerMask(AliRawReader* rawReader) const
+AliHLTTriggerMask_t AliHLTMiscImplementation::GetTriggerMask(AliRawReader* rawReader) const
 {
   // see header file for function documentation
   if (!rawReader) return 0;
-  AliHLTUInt64_t trgMask=0;
+  AliHLTTriggerMask_t trgMask=0;
   if (rawReader) {
     const UInt_t* pattern=rawReader->GetTriggerPattern();
-    trgMask=pattern[1]&0xfffffff; // 28 upper bits of the 50 bit mask
+    if(rawReader->GetVersion()==3){
+      trgMask=pattern[3];
+      trgMask<<=32;
+      trgMask|=pattern[2];
+      trgMask<<=32;
+    }
+    trgMask|=pattern[1];
     trgMask<<=32;
     trgMask|=pattern[0]; // 32 lower bits of the mask
   }
@@ -285,9 +240,9 @@ AliHLTUInt64_t AliHLTMiscImplementation::GetTriggerMask(AliRawReader* rawReader)
 AliHLTUInt32_t AliHLTMiscImplementation::GetTimeStamp(AliRawReader* rawReader) const
 {
   // extract time stamp of the event from the event header
-  if (!rawReader) return 0;
+  if (!rawReader) return kMaxUInt;
   const AliRawEventHeaderBase* eventHeader = rawReader->GetEventHeader();
-  if (!eventHeader) return 0;
+  if (!eventHeader) return kMaxUInt;
   return eventHeader->Get("Timestamp");
 }
 
@@ -297,7 +252,33 @@ AliHLTUInt32_t AliHLTMiscImplementation::GetEventType(AliRawReader* rawReader) c
   if (!rawReader) return 0;
   const AliRawEventHeaderBase* eventHeader = rawReader->GetEventHeader();
   if (!eventHeader) return 0;
-  return eventHeader->Get("Type");
+  UInt_t daqType = eventHeader->Get("Type");
+  switch(daqType){
+  case AliRawEventHeaderBase::kStartOfRun:
+  case AliRawEventHeaderBase::kStartOfData:
+    return gkAliEventTypeStartOfRun;
+
+  case AliRawEventHeaderBase::kEndOfRun:
+  case AliRawEventHeaderBase::kEndOfData:
+    return gkAliEventTypeEndOfRun;
+
+  case AliRawEventHeaderBase::kPhysicsEvent:
+    return gkAliEventTypeData;
+
+  case AliRawEventHeaderBase::kCalibrationEvent:
+    return gkAliEventTypeCalibration;
+
+  case AliRawEventHeaderBase::kFormatError:
+    return gkAliEventTypeCorruptID;
+
+  case AliRawEventHeaderBase::kSystemSoftwareTriggerEvent:
+  case AliRawEventHeaderBase::kDetectorSoftwareTriggerEvent:
+    return gkAliEventTypeSoftware;
+
+    // TODO: Sync Event Type not implemented!
+    //case AliRawEventHeaderBase::kSyncEvent:
+  }
+  return gkAliEventTypeUnknown;
 }
 
 const char* AliHLTMiscImplementation::GetBeamTypeFromGRP() const
@@ -327,18 +308,13 @@ void AliHLTMiscImplementation::GetBxByBz(const Double_t r[3], Double_t b[3])
 const TClass* AliHLTMiscImplementation::IsAliESDHLTDecision() const
 {
   // Return the IsA of the AliESDHLTDecision class
-#ifndef HAVE_NOT_ALIESDHLTDECISION
   return AliESDHLTDecision::Class();
-#else // HAVE_NOT_ALIESDHLTDECISION
-  return NULL;
-#endif // HAVE_NOT_ALIESDHLTDECISION
 }
 
 int AliHLTMiscImplementation::Copy(const AliHLTGlobalTriggerDecision* pDecision, TObject* object) const
 {
   // Copy HLT global trigger decision to AliESDHLTDecision container
   if (!pDecision || !object) return -EINVAL;
-#ifndef HAVE_NOT_ALIESDHLTDECISION
   AliESDHLTDecision* pESDHLTDecision=NULL;
   if (object->IsA()==NULL ||
       object->IsA() != AliESDHLTDecision::Class() ||
@@ -351,7 +327,6 @@ int AliHLTMiscImplementation::Copy(const AliHLTGlobalTriggerDecision* pDecision,
   pESDHLTDecision->~AliESDHLTDecision();
   new (pESDHLTDecision) AliESDHLTDecision(pDecision->Result(), pDecision->GetTitle());
 
-#endif // HAVE_NOT_ALIESDHLTDECISION
   return 0;
 }
 
@@ -394,7 +369,7 @@ int AliHLTMiscImplementation::InitStreamerInfos(TObjArray* pSchemas) const
            AliDebug(0,Form("skipping schema definition %d version %d to class %s as this is the native version", i, version, pSchema->GetName()));
            continue;
          }
-         TObjArray* pInfos=pClass->GetStreamerInfos();
+         TObjArray* pInfos=const_cast<TObjArray*>(pClass->GetStreamerInfos());
          if (pInfos /*&& version<pInfos->GetEntriesFast()*/) {
            if (pInfos->At(version)==NULL) {
              TStreamerInfo* pClone=(TStreamerInfo*)pSchema->Clone();
@@ -428,3 +403,66 @@ int AliHLTMiscImplementation::InitStreamerInfos(TObjArray* pSchemas) const
 
   return 0;
 }
+
+int AliHLTMiscImplementation::MergeStreamerInfo(TObjArray* tgt, const TObjArray* src, int iVerbosity) const
+{
+  /// merge streamer info entries from source array to target array
+  /// return 1 if target array has been changed
+
+  // add all existing infos if not existing in the current one, or having
+  // different class version
+  int iResult=0;
+  if (!tgt || !src) return -EINVAL;
+
+  {
+    // check if all infos from the existing entry are in the new entry and with
+    // identical class version
+    TIter next(src);
+    TObject* nextobj=NULL;
+    while ((nextobj=next())) {
+      TStreamerInfo* srcInfo=dynamic_cast<TStreamerInfo*>(nextobj);
+      if (!srcInfo) continue;
+      TString srcInfoName=srcInfo->GetName();
+
+      int i=0;
+      for (; i<tgt->GetEntriesFast(); i++) {
+       if (tgt->At(i)==NULL) continue;
+       if (srcInfoName.CompareTo(tgt->At(i)->GetName())!=0) continue;
+       // TODO: 2010-08-23 some more detailed investigation is needed.
+       // Structures used for data exchange, e.g. AliHLTComponentDataType
+       // or AliHLTEventDDLV1 do not have a class version, but need to be stored in the
+       // streamer info. Strictly speaking not, because those structures are not supposed
+       // to be changed at all, so they should be the same in all versions in the future.
+       // There has been a problem with detecting whether the streamer info is already in
+       // the target array if the srcInfo has class version -1. As it just concerns
+       // structures not going to be changed we can safely skip checking the class version,
+       // as long as the entry is already in the target streamer infos it does not need
+       // to be copied again.
+       if (srcInfo->GetClassVersion()<0) break;
+       TStreamerInfo* tgtInfo=dynamic_cast<TStreamerInfo*>(tgt->At(i));
+       if (tgtInfo && tgtInfo->GetClassVersion()==srcInfo->GetClassVersion()) break;
+      }
+      if (i<tgt->GetEntriesFast()) continue;
+
+      iResult=1;
+      if (iVerbosity>0) {
+       AliInfo(Form("adding streamer info for class %s version %d", srcInfoName.Data(), srcInfo->GetClassVersion()));
+      }
+      tgt->Add(srcInfo);
+    }
+  }
+
+  return iResult;
+}
+
+void AliHLTMiscImplementation::SetAliESDtrackOnlineModeFlag(bool mode) const
+{
+  /// set the online mode flag of AliESDtrack
+  AliESDtrack::OnlineMode(mode);
+}
+
+bool AliHLTMiscImplementation::GetAliESDtrackOnlineModeFlag() const
+{
+  /// get status of the online mode flag of AliESDtrack
+  return AliESDtrack::OnlineMode();
+}