KaliVeda  1.13/01
Heavy-Ion Analysis Toolkit
KVGVList.cpp
Go to the documentation of this file.
1 // Author: Daniel Cussol
2 //
3 // 17/02/2004
4 #include "Riostream.h"
5 #include "KVGVList.h"
6 #include "KVNucleusEvent.h"
7 
9 
10 
11 //_________________________________________________________________
12 
13 
15 void KVGVList::init_KVGVList(void)
16 {
17  fNbBranch = 0;
18  fNbIBranch = 0;
19 }
20 
21 
22 
31 
33  fSelection(selection)
34 {
35  // Create a list of global variables.
36  //
37  // If given, the KVParticleCondition will be used to select the particles to iterate
38  // over in each event in order to calculate the global variables.
39  //
40  // By default, if no selection is defined, only particles which are "OK" (i.e. for which
41  // KVParticle::IsOK() returns true) will be iterated over - this will change in the future!
42 
43  SetName(name);
44  init_KVGVList();
45 }
46 
47 
48 
49 
51 
53 {
54  init_KVGVList();
55  a.Copy(*this);
56 }
57 
58 
59 
66 
67 void KVGVList::Init(void)
68 {
69  // Initialisation of all global variables in list
70  //
71  // As this method may be called several times we ensure that variables are only initialised once
72  //
73  // If no selection for particles in the event has been defined, a default selection of "OK" particles is set here.
74 
75  this->R__FOR_EACH(KVVarGlob, ListInit)();
76  if (!fSelection.IsSet()) {
77  fSelection.Set("OK", [](const KVNucleus * n) {
78  return n->IsOK();
79  });
80  }
81 }
82 
83 
84 
87 
88 void KVGVList::Reset(void)
89 {
90  // Reset all variables before treating an event
91  this->R__FOR_EACH(KVVarGlob, Reset)();
92  fAbortEventAnalysis = false;
93 }
94 
95 
96 
101 
102 void KVGVList::Fill(const KVNucleus* c)
103 {
104  // Calls KVVarGlob::Fill(KVNucleus*) method of all one-body variables in the list
105  // for all KVNucleus satisfying the KVParticleCondition given to
106  // KVVarGlob::SetSelection() (if no selection given, all nuclei are used).
107 
108  fVG1.R__FOR_EACH(KVVarGlob, Fill)(c);
109 }
110 
111 
112 
113 
118 
119 void KVGVList::Fill2(const KVNucleus* c1, const KVNucleus* c2)
120 {
121  // Calls KVVarGlob::Fill(KVNucleus*,KVNucleus*) method of all two-body variables in the list
122  // for all pairs of KVNucleus (c1,c2) satisfying the KVParticleCondition given to
123  // KVVarGlob::SetSelection() (if no selection given, all nuclei are used).
124 
125  fVG2.R__FOR_EACH(KVVarGlob, Fill2)(c1, c2);
126 }
127 
128 
129 
132 
133 void KVGVList::FillN(const KVEvent* r)
134 {
135  // Calls KVVarGlob::FillN(KVEvent*) method of all N-body variables in the list
136  fVGN.R__FOR_EACH(KVVarGlob, FillN)(r);
137 }
138 
139 
140 
143 
145 {
146  // Calculate all 1-body observables after filling
147  TIter it(&fVG1);
148  KVVarGlob* vg;
149  while ((vg = (KVVarGlob*)it())) {
150  vg->Calculate();
151  if (!vg->TestEventSelection()) {
152  fAbortEventAnalysis = true;
153  break;
154  }
155  }
156 }
157 
158 
159 
162 
164 {
165  // Calculate all 2-body observables after filling
166  TIter it(&fVG2);
167  KVVarGlob* vg;
168  while ((vg = (KVVarGlob*)it())) {
169  vg->Calculate();
170  if (!vg->TestEventSelection()) {
171  fAbortEventAnalysis = true;
172  break;
173  }
174  }
175 }
176 
177 
178 
181 
183 {
184  // Calculate all N-body observables after filling
185  TIter it(&fVGN);
186  KVVarGlob* vg;
187  while ((vg = (KVVarGlob*)it())) {
188  vg->Calculate();
189  if (!vg->TestEventSelection()) {
190  fAbortEventAnalysis = true;
191  break;
192  }
193  }
194 }
195 
196 
197 
210 
212 {
213  // This method will calculate all global variables defined in the list for the event 'e'.
214  //
215  // This will iterate over all particles in the event which correspond to the KVParticleCondition fSelection;
216  // if none has been defined, only particles for which KVParticle::IsOK() returns true will be used.
217  //
218  // Note that for 2-body variables, the Fill2 method will be called for each distinct pair of particles
219  // in the event, plus each pair made up of a particle and itself.
220  //
221  // For each variable for which an event selection condition was set (see KVVarGlob::SetEventSelection())
222  // the condition is tested as soon as the variable is calculated. If the condition is not satisfied,
223  // calculation of the other variables is abandonded and method AbortEventAnalysis() returns kTRUE.
224 
225  Reset();
226 
227  TIter it(this);
228  KVVarGlob* vg;
229  while ((vg = (KVVarGlob*)it())) {
230 
231  if (vg->IsGlobalVariable()) {
232  // call Fill methods for global variables
233  if (vg->IsNBody())
234  vg->FillN(e);
235  else {
236  for (auto it = EventIterator(e, fSelection).begin(); it != KVNucleusEvent::Iterator::End(); ++it) {
237  if (vg->IsTwoBody()) {
238  for (auto it2 = it; it2 != KVNucleusEvent::Iterator::End(); ++it2) {
239  // we use every distinct pair of particles (including identical pairs) in the event
240  vg->Fill2(it.get_const_pointer(), it2.get_const_pointer());
241  }
242  }
243  else
244  vg->Fill(it.get_const_pointer());
245  }
246  }
247  }
248  // call calculate for global variables and for KVEventClassifier objects
249  vg->Calculate();
250  if ((fAbortEventAnalysis = !vg->TestEventSelection())) {
251  return;
252  }
253  vg->DefineNewFrame(e);
254  }
255 }
256 
257 
258 
261 
262 KVVarGlob* KVGVList::GetGV(const Char_t* nom) const
263 {
264  //Return pointer to global variable in list with name 'nom'
265 
266  return (KVVarGlob*) FindObject(nom);
267 }
268 
269 
270 
278 
280 {
281  // Overrides KVUniqueNameList::Add(TObject*) so that global variable pointers are sorted
282  // between the 3 lists used for 1-body, 2-body & N-body variables.
283  //
284  // We also print a warning in case the user tries to add a global variable with the
285  // same name as one already in the list. In the case we retain only the first global variable,
286  // any others with the same name are ignored
287 
288  KVUniqueNameList::Add(obj); // add object to main list, check duplicates
289  if (!ObjectAdded()) {
290  Warning("Add", "You tried to add a global variable with the same name as one already in the list");
291  Warning("Add", "Only the first variable added to the list will be used: name=%s class=%s",
292  GetGV(obj->GetName())->GetName(), GetGV(obj->GetName())->ClassName());
293  Warning("Add", "The following global variable (the one you tried to add) will be ignored:");
294  printf("\n");
295  obj->Print();
296  return;
297  }
298  if (obj->InheritsFrom("KVVarGlob")) {
299  // put global variable pointer in appropriate list
300  KVVarGlob* vg = (KVVarGlob*)obj;
301  if (vg->IsOneBody()) fVG1.Add(vg);
302  else if (vg->IsTwoBody()) fVG2.Add(vg);
303  else if (vg->IsNBody()) fVGN.Add(vg);
304  }
305 }
306 
307 
315 
317 {
318  // Overrides KVUniqueNameList::AddFirst(TObject*) so that global variable pointers are sorted
319  // between the 3 lists used for 1-body, 2-body & N-body variables.
320  //
321  // We also print a warning in case the user tries to add a global variable with the
322  // same name as one already in the list. In the case we retain only the first global variable,
323  // any others with the same name are ignored
324 
325  KVUniqueNameList::AddFirst(obj); // add object to main list, check duplicates
326  if (!ObjectAdded()) {
327  Warning("AddFirst", "You tried to add a global variable with the same name as one already in the list");
328  Warning("AddFirst", "Only the first variable added to the list will be used: name=%s class=%s",
329  GetGV(obj->GetName())->GetName(), GetGV(obj->GetName())->ClassName());
330  Warning("AddFirst", "The following global variable (the one you tried to add) will be ignored:");
331  printf("\n");
332  obj->Print();
333  return;
334  }
335  if (obj->InheritsFrom("KVVarGlob")) {
336  // put global variable pointer in appropriate list
337  KVVarGlob* vg = (KVVarGlob*)obj;
338  if (vg->IsOneBody()) fVG1.Add(vg);
339  else if (vg->IsTwoBody()) fVG2.Add(vg);
340  else if (vg->IsNBody()) fVGN.Add(vg);
341  }
342 }
343 
344 
345 
346 
360 
362 {
363  // Create a branch in the TTree for each global variable in the list.
364  // A leaf with the name of each global variable will be created to hold the
365  // value of the variable (result of KVVarGlob::GetValue() method).
366  // For multi-valued global variables we add a branch for each value with name
367  //
368  // `GVname.ValueName`
369  //
370  // To avoid problems with TTree::Draw, 'GVName' will be sanitized i.e. any
371  // mathematical symbols will be replaced by '_'.
372  //
373  // Any variable for which KVVarGlob::SetMaxNumBranches() was called with argument `0`
374  // will not be added to the TTree.
375 
376  if (!tree) return;
377 
378  // Make sure all variables are initialised before proceeding
379  Init();
380 
381  fNbBranch = 0;
382  fNbIBranch = 0;
383  fBranchVar.clear();
384  fIBranchVar.clear();
385 
386  // calculate the number of variables which will be stored in each vector
387  // the space has to be pre-reserved not added by successive "push_back"s, otherwise references to vector elements
388  // are invalidated every time the vector reallocates space
389 
390  TIter next(this);
391  KVVarGlob* ob;
392  while ((ob = (KVVarGlob*)next())) {
393  if (ob->GetNumberOfBranches()) { //skip variables for which KVVarGlob::SetMaxNumBranches(0) was called
394  if (ob->GetNumberOfValues() > 1) {
395  // multi-valued variable
396  for (int i = 0; i < ob->GetNumberOfBranches(); i++) {
397  if (ob->GetValueType(i) == 'I') ++fNbIBranch;
398  else ++fNbBranch;
399  }
400  }
401  else {
402  if (ob->GetValueType(0) == 'I') ++fNbIBranch;
403  else ++fNbBranch;
404  }
405  }
406  }
407 
408  fBranchVar.reserve(fNbBranch);
409  fIBranchVar.reserve(fNbIBranch);
410  fNbBranch = 0;
411  fNbIBranch = 0;
412 
413  next.Reset();
414 
415  while ((ob = (KVVarGlob*)next())) {
416  if (ob->GetNumberOfBranches()) { //skip variables for which KVVarGlob::SetMaxNumBranches(0) was called
417  TString sane_varname = NameSanitizer(ob->GetName());
418  if (ob->GetNumberOfValues() > 1) {
419  // multi-valued variable
420  for (int i = 0; i < ob->GetNumberOfBranches(); i++) {
421  // replace any nasty mathematical symbols which could pose problems
422  // in names of TTree leaves/branches
423  TString sane_name(ob->GetValueName(i));
424  sane_name.ReplaceAll("*", "star");
425  if (ob->GetValueType(i) == 'I') {
426  tree->Branch(Form("%s.%s", sane_varname.Data(), sane_name.Data()), &fIBranchVar[ fNbIBranch ], Form("%s.%s/I", sane_varname.Data(), sane_name.Data()));
427  ++fNbIBranch;
428  }
429  else {
430  tree->Branch(Form("%s.%s", sane_varname.Data(), sane_name.Data()), &fBranchVar[ fNbBranch ], Form("%s.%s/D", sane_varname.Data(), sane_name.Data()));
431  ++fNbBranch;
432  }
433  }
434  }
435  else {
436  if (ob->GetValueType(0) == 'I') {
437  tree->Branch(sane_varname, &fIBranchVar[ fNbIBranch ], Form("%s/I", sane_varname.Data()));
438  ++fNbIBranch;
439  }
440  else {
441  tree->Branch(sane_varname, &fBranchVar[ fNbBranch ], Form("%s/D", sane_varname.Data()));
442  ++fNbBranch;
443  }
444  }
445  }
446  }
447 }
448 
449 
450 
451 
458 
460 {
461  // Use this method ONLY if you first use MakeBranches(TTree*) in order to
462  // automatically create branches for your global variables.
463  // Call this method for each event in order to put the values of the variables
464  // in the branches ready for TTree::Fill to be called (note that TTree::Fill is not
465  // called in this method: you should do it after this).
466 
467  if (!fNbBranch && !fNbIBranch) return; // MakeBranches has not been called
468 
469  int INT_index = 0;
470  int FLT_index = 0;
471  TIter next(this);
472  KVVarGlob* ob;
473  while ((ob = (KVVarGlob*)next())) {
474  if (ob->GetNumberOfBranches()) { //skip variables for which KVVarGlob::SetMaxNumBranches(0) was called
475 
476  if (ob->GetNumberOfValues() > 1) {
477  // multi-valued variable
478  for (int j = 0; j < ob->GetNumberOfBranches(); j++) {
479  if (ob->GetValueType(j) == 'I') {
480  fIBranchVar[ INT_index ] = (Int_t)ob->GetValue(j);
481  ++INT_index;
482  }
483  else {
484  fBranchVar[ FLT_index ] = ob->GetValue(j);
485  ++FLT_index;
486  }
487  }
488  }
489  else {
490  if (ob->GetValueType(0) == 'I') {
491  fIBranchVar[ INT_index ] = (Int_t)ob->GetValue();
492  ++INT_index;
493  }
494  else {
495  fBranchVar[ FLT_index ] = ob->GetValue();
496  ++FLT_index;
497  }
498  }
499 
500  }
501  }
502 }
503 
504 
505 
554 
556 {
557  // Add an event classification object to the list, based on the named global variable
558  // (which must already be in the list).
559  //
560  // \param[in] varname name of global variable previously added to list
561  // \param[in] value [optional] for multi-valued variables, you can specify which value to use by name, or a mathematical expression
562  // involving one or more of the available values
563  //
564  // Returns a pointer to the object, in order to add either cuts or bins like so:
565  //
566  // #### Using cuts
567  //~~~~{.cpp}
568  // mtot_cuts->AddCut(5);
569  // mtot_cuts->AddCut(10);
570  // mtot_cuts->AddCut(15);
571  // mtot_cuts->AddCut(20);
572  // mtot_cuts->AddCut(25);
573  // mtot_cuts->AddCut(30);
574  //~~~~
575  // This will class events according to:
576  // | mtot | mtot_EC |
577  // |------------|---------|
578  // | <5 | 0 |
579  // | [5, 9] | 1 |
580  // | [10, 14] | 2 |
581  // | [15, 19] | 3 |
582  // | [20, 24] | 4 |
583  // | [25, 29] | 5 |
584  // | >=30 | 6 |
585  //
586  // `mtot_EC` is the default name for an event classification based on `mtot` and will be
587  // used for the branch added to the user's analysis TTree by method MakeBranches().
588  //
589  // #### Using bins
590  // ~~~~{.cpp}
591  // mtot_cuts->AddBin(5,10);
592  // mtot_cuts->AddBin(15,20);
593  // mtot_cuts->AddBin(25,30);
594  //~~~~
595  //This will class events according to the 2 bins with the following numbers:
596  // | mtot | mtot_EC |
597  // |----------|-------------|
598  // | [5, 9] | 0 |
599  // | [15, 19] | 1 |
600  // | [25, 29] | 2 |
601  // | other | -1 |
602  //
603  // Note that in this case, any value outside of a defined bin is unclassified.
604 
605  KVVarGlob* gv = GetGV(varname);
606  if (!gv) {
607  Warning("AddEventClassifier", "Variable %s not found in list. No classification possible.", varname.Data());
608  }
609  KVEventClassifier* ec = new KVEventClassifier(gv, value);
610  Add(ec);
611  return ec;
612 }
613 
614 
615 
647 
648 KVVarGlob* KVGVList::AddGV(const Char_t* class_name, const Char_t* name)
649 {
650  //Add a global variable to the list.
651  //
652  //`"class_name"` must be the name of a valid class inheriting from KVVarGlob, e.g. any of the default global
653  //variable classes defined as part of the standard KaliVeda package (see the [Global Variables module](group__GlobalVariables.html)),
654  //or the name of a user-defined class (see below).
655  //
656  //`"name"` is a unique name for the new global variable object which will be created and added to the
657  //list of global variables. This name can later be used to retrieve the object (see GetGV()).
658  //
659  //Returns pointer to new global variable object in case more than the usual default initialisation is necessary.
660  //
661  //### User-defined global variables
662  //The user may use her own global variables, without having to add them to the main libraries.
663  //If the given class name is not known, it is assumed to be a user-defined class and we attempt to compile and load
664  //the class from the user's source code. For this to work, the user must:
665  //
666  // 1. add to the ROOT macro path the directory where her class's source code is kept, e.g. in `$HOME/.rootrc` add the following line:
667  //
668  //~~~~~~~~~~~~~~~
669  // +Unix.*.Root.MacroPath: $(HOME)/myVarGlobs
670  //~~~~~~~~~~~~~~~
671  //
672  // 2. for each user-defined class, add a line to $HOME/.kvrootrc to define a "plugin". E.g. for a class called MyNewVarGlob,
673  //
674  //~~~~~~~~~~~~~~~
675  // +Plugin.KVVarGlob: MyNewVarGlob MyNewVarGlob MyNewVarGlob.cpp+ "MyNewVarGlob(const char*)"
676  //~~~~~~~~~~~~~~~
677  //
678  // It is assumed that `MyNewVarGlob.h` and `MyNewVarGlob.cpp` will be found in `$HOME/myVarGlobs` (in this example).
679  // The constructor taking a single character string argument (name of the variable) must be defined in the class.
680 
681  KVVarGlob* vg = prepareGVforAdding(class_name, name);
682  if (vg) Add(vg);
683  return vg;
684 }
685 
686 
687 
689 
690 KVVarGlob* KVGVList::prepareGVforAdding(const Char_t* class_name, const Char_t* name)
691 {
692  KVVarGlob* vg = nullptr;
693  TClass* clas = TClass::GetClass(class_name);
694  if (!clas) {
695  //class not in dictionary - user-defined class ? Look for plugin.
696  TPluginHandler* ph = KVBase::LoadPlugin("KVVarGlob", class_name);
697  if (!ph) {
698  //not found
699  Error("AddGV(const Char_t*,const Char_t*)",
700  "Called with class_name=%s.\nClass is unknown: not in standard libraries, and plugin (user-defined class) not found",
701  class_name);
702  return 0;
703  }
704  else {
705  vg = (KVVarGlob*) ph->ExecPlugin(1, name);
706  }
707  }
708  else if (!clas->InheritsFrom("KVVarGlob")) {
709  Error("AddGV(const Char_t*,const Char_t*)",
710  "%s is not a valid class deriving from KVVarGlob.",
711  class_name);
712  return nullptr;
713  }
714  else {
715  // need to use plugins to create even known classes, in order to call ctor with name
716  TPluginHandler* ph = KVBase::LoadPlugin("KVVarGlob", class_name);
717  if (!ph) {
718  // define plugin handler for known class
719  gPluginMgr->AddHandler("KVVarGlob", class_name, class_name, "KVMultiDetglobvars", Form("%s(const char*)", class_name));
720  ph = KVBase::LoadPlugin("KVVarGlob", class_name);
721  }
722  vg = (KVVarGlob*) ph->ExecPlugin(1, name);
723  }
724  return vg;
725 }
726 
727 
728 
733 
734 KVVarGlob* KVGVList::AddGVFirst(const Char_t* class_name, const Char_t* name)
735 {
736  // Add a global variable at the beginning of the list.
737  //
738  // See AddGV() for details.
739 
740  KVVarGlob* vg = prepareGVforAdding(class_name, name);
741  if (vg) AddFirst(vg);
742  return vg;
743 }
744 
745 
int Int_t
KVTemplateEvent< KVNucleus >::EventIterator EventIterator
ClassImp(KVPartitionList) void KVPartitionList
Initialisation.
ROOT::R::TRInterface & r
#define c(i)
#define e(i)
char Char_t
#define R__FOR_EACH(type, proc)
R__EXTERN TPluginManager * gPluginMgr
char * Form(const char *fmt,...)
static TPluginHandler * LoadPlugin(const Char_t *base, const Char_t *uri="0")
Definition: KVBase.cpp:793
Simple class for sorting events according to global variables.
Abstract base class container for multi-particle events.
Definition: KVEvent.h:66
Manage a list of global variables.
Definition: KVGVList.h:122
void FillBranches()
Definition: KVGVList.cpp:459
KVParticleCondition fSelection
used to select particles to iterate over in event
Definition: KVGVList.h:124
KVVarGlob * AddGVFirst(const Char_t *class_name, const Char_t *name)
Definition: KVGVList.cpp:734
Int_t fNbIBranch
Definition: KVGVList.h:128
void Reset(void)
Reset all variables before treating an event.
Definition: KVGVList.cpp:88
void Init(void)
Definition: KVGVList.cpp:67
std::vector< Double_t > fBranchVar
used for automatic creation & filling of TTree branches
Definition: KVGVList.h:125
TList fVG2
two-body variables
Definition: KVGVList.h:147
TString NameSanitizer(const Char_t *s) const
Definition: KVGVList.h:132
Int_t fNbBranch
Definition: KVGVList.h:127
virtual void AddFirst(TObject *obj)
Definition: KVGVList.cpp:316
void Calculate2()
Calculate all 2-body observables after filling.
Definition: KVGVList.cpp:163
void CalculateN()
Calculate all N-body observables after filling.
Definition: KVGVList.cpp:182
void CalculateGlobalVariables(KVEvent *e)
Definition: KVGVList.cpp:211
bool fAbortEventAnalysis
set to false if a global variable fails its own event selection criterion
Definition: KVGVList.h:129
void FillN(const KVEvent *e)
Calls KVVarGlob::FillN(KVEvent*) method of all N-body variables in the list.
Definition: KVGVList.cpp:133
std::vector< Int_t > fIBranchVar
used for automatic creation & filling of TTree branches
Definition: KVGVList.h:126
KVEventClassifier * AddEventClassifier(const TString &varname, const TString &value="")
Definition: KVGVList.cpp:555
TList fVGN
N-body variables.
Definition: KVGVList.h:148
void Calculate()
Calculate all 1-body observables after filling.
Definition: KVGVList.cpp:144
KVVarGlob * prepareGVforAdding(const Char_t *class_name, const Char_t *name)
Definition: KVGVList.cpp:690
TList fVG1
one-body variables
Definition: KVGVList.h:146
KVVarGlob * AddGV(const Char_t *class_name, const Char_t *name)
Definition: KVGVList.cpp:648
virtual void Add(TObject *obj)
Definition: KVGVList.cpp:279
void Fill(const KVNucleus *c)
Definition: KVGVList.cpp:102
void init_KVGVList(void)
Definition: KVGVList.cpp:15
void MakeBranches(TTree *)
Definition: KVGVList.cpp:361
KVVarGlob * GetGV(const Char_t *nom) const
Return pointer to global variable in list with name 'nom'.
Definition: KVGVList.cpp:262
KVGVList(const KVString &name="default", const KVParticleCondition &selection=KVParticleCondition())
Definition: KVGVList.cpp:32
void Fill2(const KVNucleus *c1, const KVNucleus *c2)
Definition: KVGVList.cpp:119
Description of properties and kinematics of atomic nuclei.
Definition: KVNucleus.h:125
virtual TObject * FindObject(const char *name) const
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
Definition: KVString.h:72
void Set(const KVString &name, const LambdaFunc &F)
Optimised list in which named objects can only be placed once.
Bool_t ObjectAdded() const
virtual void Add(TObject *obj)
virtual void AddFirst(TObject *obj)
Base class for all global variable implementations.
Definition: KVVarGlob.h:231
virtual void Calculate()=0
Bool_t IsOneBody() const
Definition: KVVarGlob.h:367
virtual Int_t GetNumberOfValues() const
Definition: KVVarGlob.h:632
Double_t GetValue(void) const
Definition: KVVarGlob.h:441
void Fill(const KVNucleus *c)
Definition: KVVarGlob.h:404
virtual void FillN(const KVEvent *)
Definition: KVVarGlob.h:428
Int_t GetNumberOfBranches() const
Definition: KVVarGlob.h:638
void Fill2(const KVNucleus *n1, const KVNucleus *n2)
Definition: KVVarGlob.h:418
virtual Bool_t IsGlobalVariable() const
Definition: KVVarGlob.h:385
virtual TString GetValueName(Int_t i) const
Definition: KVVarGlob.h:648
virtual Char_t GetValueType(Int_t) const
Definition: KVVarGlob.h:662
void DefineNewFrame(KVEvent *e) const
Definition: KVVarGlob.h:731
bool TestEventSelection() const
Definition: KVVarGlob.h:710
Bool_t IsNBody() const
Definition: KVVarGlob.h:379
Bool_t IsTwoBody() const
Definition: KVVarGlob.h:373
static TClass * GetClass(Bool_t load=kTRUE, Bool_t silent=kFALSE)
Bool_t InheritsFrom(const char *cl) const
void SetName(const char *name)
TIter begin() const
void Reset()
virtual void Add(TObject *obj)
virtual const char * GetName() const
virtual const char * GetName() const
virtual const char * ClassName() const
virtual void Warning(const char *method, const char *msgfmt,...) const
virtual Bool_t InheritsFrom(const char *classname) const
virtual void Error(const char *method, const char *msgfmt,...) const
virtual void Print(Option_t *option="") const
Longptr_t ExecPlugin(int nargs, const T &... params)
void AddHandler(const char *base, const char *regexp, const char *className, const char *pluginName, const char *ctor=0, const char *origin=0)
const char * Data() const
TString & ReplaceAll(const char *s1, const char *s2)
return c1
const Int_t n
return c2
auto * a