KaliVeda
Toolkit for HIC analysis
KVDataAnalysisTask.cpp
1 /*
2 $Id: KVDataAnalysisTask.cpp,v 1.10 2009/01/14 16:01:38 franklan Exp $
3 $Revision: 1.10 $
4 $Date: 2009/01/14 16:01:38 $
5 $Author: franklan $
6 */
7 
8 #include "KVDataAnalysisTask.h"
9 #include "TSystem.h"
10 #include "Riostream.h"
11 #include "TObjString.h"
12 #include "TClass.h"
13 #include "TPluginManager.h"
14 
15 using namespace std;
16 
18 
19 
20 
24 {
25  //Default ctor.
26  fUserClass = kFALSE;
27  fBaseIsPlugin = kFALSE;
28  fStatusUpdateInterval = 1000;
29 }
30 
31 
32 
35 
37 {
38  //Copy ctor
39 #if ROOT_VERSION_CODE >= ROOT_VERSION(3,4,0)
40  obj.Copy(*this);
41 #else
42  ((KVDataAnalysisTask&) obj).Copy(*this);
43 #endif
44 }
45 
46 
47 #if ROOT_VERSION_CODE >= ROOT_VERSION(3,4,0)
48 
52 
54 #else
56 #endif
57 {
58  //Copy this to obj
59  //Redefinition of KVBase::Copy
60 
61  KVBase::Copy(obj);
62  ((KVDataAnalysisTask&) obj).fPrereq = fPrereq;
63  ((KVDataAnalysisTask&) obj).fOutput = fOutput;
64  ((KVDataAnalysisTask&) obj).fAnalyser = fAnalyser;
65  ((KVDataAnalysisTask&) obj).fBaseClass = fBaseClass;
66  ((KVDataAnalysisTask&) obj).fUserClass = fUserClass;
67  ((KVDataAnalysisTask&) obj).fBaseIsPlugin = fBaseIsPlugin;
68  ((KVDataAnalysisTask&) obj).fPluginBase = fPluginBase;
69  ((KVDataAnalysisTask&) obj).fPluginURI = fPluginURI;
70  ((KVDataAnalysisTask&) obj).fExtraAClicIncludes = fExtraAClicIncludes;
71  ((KVDataAnalysisTask&) obj).fStatusUpdateInterval = fStatusUpdateInterval;
72 }
73 
74 
75 
78 
80 {
81  //Print analysis task information
82  cout << "KVDataAnalysisTask : ";
83  cout << GetName() << " : ";
84  cout << GetTitle();
85  cout << " (pre-req = " << GetPrereq();
86  if(!GetOutputDataType().IsNull()) cout << ", output = " << GetOutputDataType();
87  cout << ", analyser = " << GetDataAnalyser();
88  if (fUserClass) cout << ", base class for user analysis = " << GetUserBaseClass();
89  else if (fBaseClass != "") cout << ", default class for analysis = " << GetUserBaseClass();
90  cout << ")" << endl;
91 }
92 
93 
94 
111 
113 {
114  // Set the class from which user's analysis class must derive.
115  // This is normally read in from the following environment variable:
116  //
117  //~~~
118  // TaskName.DataAnalysisTask.UserClass.Base: [base_name]
119  //~~~
120  //
121  // If base_name is not the name of a known (i.e. currently contained in the ROOT
122  // dictionary class table) class, it is assumed to be the uri of a plugin class.
123  // By default, we assume that the plugin extends the KVDataAnalyser class, but
124  // this can be changed using the following syntax:
125  //
126  //~~~
127  // TaskName.DataAnalysisTask.UserClass.Base: [uri]/[base class]
128  //~~~
129 
130  fBaseClass = base_name;
131  if (fBaseClass != "" && !TClass::GetClass(base_name)) {
132  // Base class is not in dictionary. Assume that base_name is a plugin.
134  KVString _base(base_name);
135  TObjArray* toks = _base.Tokenize("/");
136  if (toks->GetEntries() > 1) {
137  // base_name = uri/base
138  fPluginURI = ((TObjString*)toks->At(0))->String();
139  fPluginBase = ((TObjString*)toks->At(1))->String();
140  }
141  else {
142  // base_name = uri. default plugin base class is KVDataAnalyser
143  fPluginURI = base_name;
144  fPluginBase = "KVDataAnalyser";
145  }
146  delete toks;
147  // check plugin exists
149  if (!ph) {
150  Error("SetUserBaseClass", "Analysis task=%s :\nNo plugin found with URI=%s for base class %s",
152  return;
153  }
154  // get name of plugin base class that user's analysis must derive from
155  fBaseClass = ph->GetClass();
156  if (gDebug > 1) Info("SetUserBaseClass", "Analysis task=%s :\nUser analysis class derives from %s, extension of %s in plugin %s",
158  }
159 }
160 
161 
162 
174 
176 {
177  // This method checks that the base class for the user's analysis class is loaded.
178  // If this base class requires a plugin library to be loaded, it will be loaded.
179  //
180  // First we add any required extra ACliC include paths (taken from resource
181  //
182  //~~~
183  //DataAnalysisTask.UserClass.ExtraACliCIncludes
184  //~~~
185  //
186  // \returns kFALSE if plugin cannot be loaded or class is simply unknown
187 
188  if (fExtraAClicIncludes != "") {
190  Info("CheckUserBaseClassIsLoaded", "Added ACliC include path: %s", fExtraAClicIncludes.Data());
191  }
192  TClass* cl = TClass::GetClass(fBaseClass.Data()); // class in dictionary already ?
193  if (cl) return kTRUE;
194  if (fBaseIsPlugin) {
195  // base class is in a plugin library. load it now.
197  if (ph) return kTRUE;
198  Error("CheckUserBaseClassIsLoaded", "Analysis task=%s : Failed to load plugin class=%s base=%s uri=%s",
200  }
201  else {
202  Error("CheckUserBaseClassIsLoaded", "Analysis task=%s : User analysis base class %s is unknown",
203  GetName(), fBaseClass.Data());
204  }
205  return kFALSE;
206 }
207 
208 
bool Bool_t
char Char_t
constexpr Bool_t kFALSE
constexpr Bool_t kTRUE
const char Option_t
R__EXTERN TPluginManager * gPluginMgr
Int_t gDebug
R__EXTERN TSystem * gSystem
Base class for KaliVeda framework.
Definition: KVBase.h:139
void Error(const char *method, const char *msgfmt,...) const override
Definition: KVBase.cpp:1650
void Copy(TObject &) const override
Make a copy of this object.
Definition: KVBase.cpp:373
static TPluginHandler * LoadPlugin(const Char_t *base, const Char_t *uri="0")
Definition: KVBase.cpp:772
Define and manage data analysis tasks.
KVString GetOutputDataType() const
Bool_t fBaseIsPlugin
true if base class for user analysis is in a plugin library
KVString fPluginBase
known base class extended by plugin library
KVString fPluginURI
uri of the plugin library containing user base class
KVString fExtraAClicIncludes
to be added to AClic include paths before compilation
KVString fBaseClass
base class for user analysis
void Copy(TObject &) const override
KVDataAnalysisTask()
Default ctor.
virtual const Char_t * GetDataAnalyser() const
virtual const Char_t * GetUserBaseClass() const
virtual Bool_t CheckUserBaseClassIsLoaded() const
virtual const Char_t * GetPrereq() const
Bool_t fUserClass
true if analysis task requires user-supplied class (derived from fBaseClass)
virtual void SetUserBaseClass(const Char_t *d)
void ls(Option_t *opt="") const override
Print analysis task information.
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
Definition: KVString.h:73
static TClass * GetClass(Bool_t load=kTRUE, Bool_t silent=kFALSE)
const char * GetName() const override
const char * GetTitle() const override
Int_t GetEntries() const override
TObject * At(Int_t idx) const override
virtual void Info(const char *method, const char *msgfmt,...) const
const char * GetClass() const
TPluginHandler * FindHandler(const char *base, const char *uri=nullptr)
const char * Data() const
TObjArray * Tokenize(const TString &delim) const
virtual void AddIncludePath(const char *includePath)
const char * String
ClassImp(TPyArg)