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.
133  fBaseIsPlugin = kTRUE;
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
148  TPluginHandler* ph = gPluginMgr->FindHandler(fPluginBase.Data(), fPluginURI.Data());
149  if (!ph) {
150  KVError::Error(this, "SetUserBaseClass", "Analysis task=%s :\nNo plugin found with URI=%s for base class %s",
151  GetName(), fPluginURI.Data(), fPluginBase.Data());
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",
157  GetName(), fBaseClass.Data(), fPluginBase.Data(), fPluginURI.Data());
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 != "") {
189  gSystem->AddIncludePath(fExtraAClicIncludes.Data());
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.
196  TPluginHandler* ph = LoadPlugin(fPluginBase.Data(), fPluginURI.Data());
197  if (ph) return kTRUE;
198  KVError::Error(this, "CheckUserBaseClassIsLoaded", "Analysis task=%s : Failed to load plugin class=%s base=%s uri=%s",
199  GetName(), fBaseClass.Data(), fPluginBase.Data(), fPluginURI.Data());
200  }
201  else {
202  KVError::Error(this, "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:140
void Copy(TObject &) const override
Make a copy of this object.
Definition: KVBase.cpp:396
static TPluginHandler * LoadPlugin(const Char_t *base, const Char_t *uri="0")
Definition: KVBase.cpp:795
Define and manage data analysis tasks.
KVString GetOutputDataType() const
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
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)
void Error(UserClass p, const char *location, const char *va_(fmt),...)
Definition: KVError.h:116
const char * String
ClassImp(TPyArg)