extending LoadInstance, can be used without library argument now to create instance...
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTMisc.h
1 //-*- Mode: C++ -*-
2 // $Id$
3
4 #ifndef ALIHLTMISC_H
5 #define ALIHLTMISC_H
6 //* This file is property of and copyright by the ALICE HLT Project        * 
7 //* ALICE Experiment at CERN, All rights reserved.                         *
8 //* See cxx source for full Copyright notice                               */
9
10 /// @file   AliHLTMisc.h
11 /// @author Matthias Richter
12 /// @date   
13 /// @brief  Definition of various glue functions implemented in dynamically
14 ///         loaded libraries
15
16 #include "TObject.h"
17 #include "AliHLTStdIncludes.h"
18 #include "AliHLTDataTypes.h"
19 #include "AliHLTLogging.h"
20 #include "TClass.h"
21 #include "TSystem.h"
22
23 class AliCDBManager;
24 class AliCDBEntry;
25 class AliRawReader;
26 class AliHLTComponentDataType;
27 class AliHLTGlobalTriggerDecision;
28
29 class AliHLTMisc : public TObject {
30  public:
31   AliHLTMisc();
32   ~AliHLTMisc();
33
34   template<class T>
35   static T* LoadInstance(const T* dummy, const char* classname, const char* library=NULL);
36
37   static AliHLTMisc& Instance();
38
39   virtual int InitCDB(const char* cdbpath);
40
41   virtual int SetCDBRunNo(int runNo);
42   virtual int GetCDBRunNo();
43
44   virtual AliCDBEntry* LoadOCDBEntry(const char* path, int runNo=-1, int version = -1, int subVersion = -1);
45
46   virtual TObject* ExtractObject(AliCDBEntry* entry);
47
48   virtual int InitMagneticField() const;
49
50   virtual AliHLTUInt64_t GetTriggerMask(AliRawReader* rawReader) const;
51
52   virtual Double_t GetBz();
53   virtual Double_t GetBz(const Double_t *r);
54   virtual void GetBxByBz(const Double_t r[3], Double_t b[3]);
55
56   virtual const TClass* IsAliESDHLTDecision() const;
57   virtual int Copy(const AliHLTGlobalTriggerDecision* pDecision, TObject* pESDHLTDecision) const;
58
59  private:
60   static AliHLTMisc* fgInstance;
61
62   ClassDef(AliHLTMisc, 0)
63 };
64
65 #define ALIHLTMISC_LIBRARY "libHLTrec.so"
66 #define ALIHLTMISC_INIT_CDB "AliHLTMiscInitCDB"
67 #define ALIHLTMISC_SET_CDB_RUNNO "AliHLTMiscSetCDBRunNo"
68
69 #ifdef __cplusplus
70 extern "C" {
71 #endif
72
73   /**
74    * Init the CDB access for the running instance.
75    * The method is used from the C wrapper interface utilized by the  on-line
76    * framework. The path of the (H)CDB is set to the specified path.<br>
77    * When running from AliRoot, the CDB path is set in the startup of the
78    * reconstruction.<br>
79    * If cdbpath is nil or empty and the CDB is not already initialized, the
80    * CDB storage is set to local://$ALICE_ROOT/OCDB and the run no to 0.
81    * @param cdbpath     path to the CDB
82    * @return neg. error code if failed
83    * @note function implemented in libHLTrec
84    */
85   int AliHLTMiscInitCDB(const char* cdbpath);
86   typedef int (*AliHLTMiscInitCDB_t)(const char* cdbpath);
87
88   /**
89    * Init the Run no for the CDB access.
90    * @param runNo       the run no
91    * @return neg. error code if failed
92    * @note function implemented in libHLTrec
93    */
94   int AliHLTMiscSetCDBRunNo(int runNo);
95   typedef int (*AliHLTMiscSetCDBRunNo_t)(int runNo);
96
97 #ifdef __cplusplus
98 }
99 #endif
100
101 template<class T>
102 T* AliHLTMisc::LoadInstance(const T* /*t*/, const char* classname, const char* library)
103 {
104   // see header file for function documentation
105   int iLibResult=0;
106   T* pInstance=NULL;
107   AliHLTLogging log;
108   TClass* pCl=NULL;
109   ROOT::NewFunc_t pNewFunc=NULL;
110   do {
111     pCl=TClass::GetClass(classname);
112   } while (!pCl && library!=NULL && (iLibResult=gSystem->Load(library))==0);
113   if (iLibResult>=0) {
114     if (pCl && (pNewFunc=pCl->GetNew())!=NULL) {
115       void* p=(*pNewFunc)(NULL);
116       if (p) {
117         pInstance=reinterpret_cast<T*>(p);
118         if (!pInstance) {
119           log.Logging(kHLTLogError, "AliHLTMisc::LoadInstance", "HLT Analysis", "type cast (%s) to instance failed", classname);
120         }
121       } else {
122         log.Logging(kHLTLogError, "AliHLTMisc::LoadInstance", "HLT Analysis", "can not create instance of type %s from class descriptor", classname);
123       }
124     } else {
125       log.Logging(kHLTLogError, "AliHLTMisc::LoadInstance", "HLT Analysis", "can not find TClass descriptor %s", classname);
126     }
127   } else {
128     log.Logging(kHLTLogError, "AliHLTMisc::LoadInstance", "HLT Analysis", "can not load %s library in order to find class descriptor %s", library, classname);
129   }
130   return pInstance;
131 }
132
133 // direct printout of data type struct
134 ostream  &operator<<(ostream &str, const AliHLTComponentDataType&);
135
136 #endif //ALIHLTMISC_H