KaliVeda  1.13/01
Heavy-Ion Analysis Toolkit
KVVarGlob.h
Go to the documentation of this file.
1 #ifndef KVVarGlob_h
2 #define KVVarGlob_h
3 #include "Riostream.h"
4 #include "KVBase.h"
5 #include "KVNucleus.h"
6 #include "KVNameValueList.h"
7 #include "KVString.h"
8 #include "KVParticleCondition.h"
9 
10 class KVEvent;
11 
74 
89 
95 
222 
231 class KVVarGlob: public KVBase {
232 
233 public:
234  enum {
235  kOneBody, // one-body variable: Fill (KVNucleus*) must be defined
236  kTwoBody, // two-body variable: Fill2 (KVNucleus*, KVNucleus*) must be defined
237  kNBody // N-body variable: FillN (KVEvent*) must be defined
238  };
239 
240 protected:
243 private:
252 
253 #ifdef USING_ROOT6
254  using EventSelector = std::function<bool(const KVVarGlob*)>;
256  using FrameSetter = std::function<void(KVEvent*, const KVVarGlob*)>;
258 #endif
259 
260  Bool_t fDefineGroupFromSelection{kFALSE};// kTRUE if all selected particles are to be added to a group with the name of the variable
261 
262  void init();
263  static void AddExtraInitMethodComment(KVClassFactory& cf, KVString& body);
264 
265 protected:
266  void SetNameIndex(const Char_t* name, Int_t index);
268  {
270  nameList.Clear();
271  }
272  int GetIndexAtListPosition(int pos) const
273  {
275  return nameList.GetValue<int>(pos);
276  }
278  {
280  return nameList.GetNameAt(pos);
281  }
282 
283  static void FillMethodBody(KVString& body, int type);
284  static void AddInitMethod(KVClassFactory& cf, KVString& body);
285  static void ImplementInitMethod(KVClassFactory& cf, KVString& body, int type);
286  static void AddFillMethod(KVClassFactory& cf, int type);
287  static void AddFillMethodBody(KVClassFactory& cf, KVString& body, int type);
288 
289  virtual Double_t getvalue_void() const
290  {
292  return getvalue_int(0);
293  }
294  virtual Double_t getvalue_char(const Char_t* name) const
295  {
298 
299  return getvalue_int(GetNameIndex(name));
300  }
301  virtual Double_t getvalue_int(Int_t) const = 0;
302  virtual void fill(const KVNucleus*)
303  {
306  AbstractMethod("fill(KVNucleus*)");
307  }
308 
309  virtual void fill2(const KVNucleus*, const KVNucleus*)
310  {
319  AbstractMethod("fill2(KVNucleus*,KVNucleus*)");
320  }
321 
323  {
324  return fParameters;
325  }
327  {
328  return fParameters;
329  }
330 
331 public:
333  : KVBase("KVVarGlob", "KVVarGlob"), nameList("IndexList", "Correspondance variable name<->index")
334  {
335  init();
336  }
337  KVVarGlob(const Char_t* nom)
338  : KVBase(nom, nom), nameList("IndexList", "Correspondance variable name<->index")
339  {
340  init();
341  }
342  ROOT_COPY_CTOR(KVVarGlob, KVBase)
343  ROOT_COPY_ASSIGN_OP(KVVarGlob)
344  void Copy(TObject& obj) const
345  {
347  KVBase::Copy(obj);
348  KVVarGlob& vgobj = dynamic_cast<KVVarGlob&>(obj);
349  nameList.Copy(vgobj.nameList);
351  vgobj.fFrame = fFrame;
352  fOptions.Copy(vgobj.fOptions);
354  fSelection.Copy(vgobj.fSelection);
355  vgobj.fType = fType;
356  vgobj.fValueType = fValueType;
359 #ifdef USING_ROOT6
361  vgobj.fFrameSetter = fFrameSetter;
362 #endif
363  }
364  virtual ~KVVarGlob(void)
365  {}
366 
368  {
370  return fType == kOneBody;
371  }
372 
374  {
376  return fType == kTwoBody;
377  }
378 
379  Bool_t IsNBody() const
380  {
382  return fType == kNBody;
383  }
384 
385  virtual Bool_t IsGlobalVariable() const
386  {
387  return kTRUE;
388  }
389 
390  void ListInit()
391  {
394 
395  if (!fIsInitialized) {
396  Init();
398  }
399  }
400  virtual void Init() = 0;
401  virtual void Reset() = 0;
402  virtual void Calculate() = 0;
403 
404  void Fill(const KVNucleus* c)
405  {
412  const KVNucleus* c_in_frame = dynamic_cast<const KVNucleus*>(c->GetFrame(fFrame, false));
413  if (fSelection.Test(c_in_frame)) {
414  fill(c_in_frame);
415  if (fDefineGroupFromSelection) c->AddGroup(GetOptionString("GROUP_NAME"));
416  }
417  }
418  void Fill2(const KVNucleus* n1, const KVNucleus* n2)
419  {
423  const KVNucleus* n1_in_frame = dynamic_cast<const KVNucleus*>(n1->GetFrame(fFrame, false));
424  const KVNucleus* n2_in_frame = dynamic_cast<const KVNucleus*>(n2->GetFrame(fFrame, false));
425  if (fSelection.Test(n1_in_frame) && fSelection.Test(n2_in_frame))
426  fill2(n1_in_frame, n2_in_frame);
427  }
428  virtual void FillN(const KVEvent*)
429  {
432  AbstractMethod("FillN(KVEvent*)");
433  }
434  Bool_t HasValue(const Char_t* name) const
435  {
438 
439  return nameList.HasParameter(name);
440  }
441  Double_t GetValue(void) const
442  {
448 
449  return getvalue_void() / fNormalization;
450  }
451  Double_t GetValue(const Char_t* name) const
452  {
458 
459  return getvalue_char(name) / fNormalization;
460  }
462  {
468 
469  return getvalue_int(i) / fNormalization;
470  }
471  virtual std::vector<Double_t> GetValueVector(void) const
472  {
478 
479  std::vector<Double_t> tmp;
480  for (int i = 0; i < GetNumberOfValues(); ++i) tmp.push_back(GetValue(i) / fNormalization);
481  return tmp;
482  }
483 
484  Double_t operator()(void) const
485  {
486  return GetValue();
487  }
488 
489  Double_t operator()(const Char_t* name) const
490  {
491  return GetValue(name);
492  }
493 
495  {
496  return GetValue(i);
497  }
498 
499  Int_t GetNameIndex(const Char_t* name) const;
500 
501  static void MakeClass(const Char_t* classname, const Char_t* classdesc, int type = kOneBody);
502 
503  void SetFrame(const Char_t* ref)
504  {
512  fFrame = ref;
513  }
514  const TString& GetFrame() const
515  {
516  return fFrame;
517  }
518 
519  void SetOption(const Char_t* option, const Char_t* value)
520  {
522  KVString tmp(value);
523  fOptions.SetValue(option, tmp);
524  fIsInitialized = kFALSE; //allow re-initialisation
525  }
526 
528  {
530 
531  return fOptions.HasParameter(opt);
532  }
533 
534  TString GetOptionString(const Char_t* opt) const
535  {
537 
538  return fOptions.GetTStringValue(opt);
539  }
540  void UnsetOption(const Char_t* opt)
541  {
543 
545  }
546 
547  void SetParameter(const Char_t* par, Double_t value)
548  {
550 
551  TString Par(par);
554  if (Par == "Zmin" || Par == "Zmax" || Par == "Vmin" || Par == "Vmax")
555  Fatal("SetParameter", "Particle selection for global variables must be defined using SetSelection(const KVParticleCondition&).\nUpdate the use of variable \"%s\" in your analysis.",
556  GetName());
557  if (Par == "Normalization") fNormalization = value;
558  else fParameters.SetValue(par, value);
559  fIsInitialized = kFALSE; //allow re-initialisation
560  }
561 
562  virtual void SetNormalization(Double_t norm)
563  {
564  fNormalization = norm;
565  }
566 
568  {
570  if (TString(par) == "Normalization") return (fNormalization != 1.0);
571  return fParameters.HasParameter(par);
572  }
573 
574  Double_t GetParameter(const Char_t* par) const
575  {
577  if (TString(par) == "Normalization") return fNormalization;
578  return fParameters.GetDoubleValue(par);
579  }
580 
582  {
583  return fNormalization;
584  }
585 
586  void UnsetParameter(const Char_t* par)
587  {
589 
590  if (TString(par) == "Normalization") fNormalization = 1.0;
592  }
593 
595  {
606 
607  fSelection = sel;
608  }
609 
611  {
619 
620  fSelection &= sel;
621  }
622 
624  {
625  return GetValue();
626  }
627  operator double() const
628  {
629  return AsDouble();
630  }
631 
632  virtual Int_t GetNumberOfValues() const
633  {
636  return nameList.GetNpar();
637  }
639  {
647  }
648  virtual TString GetValueName(Int_t i) const
649  {
652  for (int j = 0; j < GetNumberOfValues(); j++) {
653  if (nameList.GetIntValue(j) == i) return nameList.GetParameter(j)->GetName();
654  }
655  return TString("unknown");
656  }
658  {
660  return nameList;
661  }
662  virtual Char_t GetValueType(Int_t) const
663  {
671 
672  return fValueType;
673  }
675  {
685  fMaxNumBranches = (n <= GetNumberOfValues() ? n : -1);
686  }
687  void Print(Option_t* = "") const;
688 
689 #ifdef USING_ROOT6
691  {
708  fEventSelector = f;
709  }
710  bool TestEventSelection() const
711  {
715 
716  if (!fEventSelector) return true;
717  bool result = fEventSelector(this);
718  return result;
719  }
721  {
729  fFrameSetter = f;
730  }
731  void DefineNewFrame(KVEvent* e) const
732  {
736  if (fFrameSetter) fFrameSetter(e, this);
737  }
738 #endif
739  void SetDefineGroup(const KVString& groupname = "");
740 
741  ClassDef(KVVarGlob, 7) // Base class for global variables
742 };
743 #endif
int Int_t
double
typedef void(GLAPIENTRYP _GLUfuncptr)(void)
#define f(i)
#define c(i)
#define e(i)
char Char_t
const Bool_t kFALSE
bool Bool_t
double Double_t
const Bool_t kTRUE
const char Option_t
#define ClassDef(name, id)
Base class for KaliVeda framework.
Definition: KVBase.h:141
virtual void Copy(TObject &) const
Make a copy of this object.
Definition: KVBase.cpp:394
Factory class for generating skeleton files for new classes.
Abstract base class container for multi-particle events.
Definition: KVEvent.h:66
Handles lists of named parameters with different types, a list of KVNamedParameter objects.
KVNamedParameter * GetParameter(Int_t idx) const
return the parameter object with index idx
Int_t GetIntValue(const Char_t *name) const
Double_t GetDoubleValue(const Char_t *name) const
void SetValue(const Char_t *name, value_type value)
void RemoveParameter(const Char_t *name)
virtual void Clear(Option_t *opt="")
const Char_t * GetNameAt(Int_t idx) const
Int_t GetNpar() const
return the number of stored parameters
value_type GetValue(const Char_t *name) const
Bool_t HasParameter(const Char_t *name) const
TString GetTStringValue(const Char_t *name) const
void Copy(TObject &nvl) const
Description of properties and kinematics of atomic nuclei.
Definition: KVNucleus.h:125
KVParticle const * GetFrame(const Char_t *frame, Bool_t warn_and_return_null_if_unknown=kTRUE) const
Definition: KVParticle.cpp:855
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
Definition: KVString.h:72
void Copy(TObject &obj) const
Make a copy of this object.
Bool_t Test(const ParticleType *nuc) const
Base class for all global variable implementations.
Definition: KVVarGlob.h:231
void SetOption(const Char_t *option, const Char_t *value)
Definition: KVVarGlob.h:519
KVNameValueList & GetParameters()
Definition: KVVarGlob.h:322
KVVarGlob(const Char_t *nom)
Definition: KVVarGlob.h:337
Double_t GetValue(const Char_t *name) const
Definition: KVVarGlob.h:451
void ListInit()
Definition: KVVarGlob.h:390
static void AddInitMethod(KVClassFactory &cf, KVString &body)
Definition: KVVarGlob.cpp:148
void Print(Option_t *="") const
Definition: KVVarGlob.cpp:277
Double_t operator()(void) const
Definition: KVVarGlob.h:484
virtual void Calculate()=0
const KVNameValueList & GetValueNameList() const
Definition: KVVarGlob.h:657
Bool_t IsOneBody() const
Definition: KVVarGlob.h:367
Bool_t fDefineGroupFromSelection
Definition: KVVarGlob.h:260
Double_t fNormalization
optional normalization parameter
Definition: KVVarGlob.h:251
virtual Int_t GetNumberOfValues() const
Definition: KVVarGlob.h:632
Double_t GetValue(void) const
Definition: KVVarGlob.h:441
KVString fFrame
(optional) name of reference frame used for kinematics
Definition: KVVarGlob.h:246
void Copy(TObject &obj) const
Make a copy of this object.
Definition: KVVarGlob.h:344
Bool_t HasValue(const Char_t *name) const
Definition: KVVarGlob.h:434
KVNameValueList fOptions
list of options
Definition: KVVarGlob.h:247
Double_t AsDouble() const
Definition: KVVarGlob.h:623
void SetNameIndex(const Char_t *name, Int_t index)
Definition: KVVarGlob.cpp:223
void SetNewFrameDefinition(const FrameSetter &f)
Definition: KVVarGlob.h:720
Double_t GetValue(Int_t i) const
Definition: KVVarGlob.h:461
const TString & GetFrame() const
Definition: KVVarGlob.h:514
void SetMaxNumBranches(Int_t n)
Definition: KVVarGlob.h:674
void ClearNameIndex()
Definition: KVVarGlob.h:267
Int_t GetNameIndex(const Char_t *name) const
Definition: KVVarGlob.cpp:254
void SetParameter(const Char_t *par, Double_t value)
Definition: KVVarGlob.h:547
static void MakeClass(const Char_t *classname, const Char_t *classdesc, int type=kOneBody)
Definition: KVVarGlob.cpp:45
EventSelector fEventSelector
used to select events in analysis based on value of variable
Definition: KVVarGlob.h:255
FrameSetter fFrameSetter
used to define a new kinematical frame for event based on variable
Definition: KVVarGlob.h:257
virtual void SetNormalization(Double_t norm)
Definition: KVVarGlob.h:562
void UnsetOption(const Char_t *opt)
Definition: KVVarGlob.h:540
virtual void fill2(const KVNucleus *, const KVNucleus *)
Definition: KVVarGlob.h:309
void Fill(const KVNucleus *c)
Definition: KVVarGlob.h:404
TString GetOptionString(const Char_t *opt) const
Definition: KVVarGlob.h:534
std::function< bool(const KVVarGlob *)> EventSelector
Definition: KVVarGlob.h:254
static void AddFillMethodBody(KVClassFactory &cf, KVString &body, int type)
Definition: KVVarGlob.cpp:191
static void ImplementInitMethod(KVClassFactory &cf, KVString &body, int type)
Definition: KVVarGlob.cpp:111
virtual Double_t getvalue_int(Int_t) const =0
Double_t operator()(Int_t i) const
Definition: KVVarGlob.h:494
Bool_t IsOptionGiven(const Char_t *opt)
Definition: KVVarGlob.h:527
std::function< void(KVEvent *, const KVVarGlob *)> FrameSetter
Definition: KVVarGlob.h:256
virtual void FillN(const KVEvent *)
Definition: KVVarGlob.h:428
Bool_t fIsInitialized
flag set after initialisation
Definition: KVVarGlob.h:245
static void AddFillMethod(KVClassFactory &cf, int type)
Definition: KVVarGlob.cpp:164
void AddSelection(const KVParticleCondition &sel)
Definition: KVVarGlob.h:610
virtual void fill(const KVNucleus *)
Definition: KVVarGlob.h:302
Double_t operator()(const Char_t *name) const
Definition: KVVarGlob.h:489
Double_t GetParameter(const Char_t *par) const
Definition: KVVarGlob.h:574
void SetEventSelection(const EventSelector &f)
Definition: KVVarGlob.h:690
void init()
Definition: KVVarGlob.cpp:16
static void FillMethodBody(KVString &body, int type)
Definition: KVVarGlob.cpp:87
TString GetNameAtListPosition(int pos) const
Definition: KVVarGlob.h:277
KVNameValueList nameList
correspondence between variable name and index
Definition: KVVarGlob.h:244
Int_t GetNumberOfBranches() const
Definition: KVVarGlob.h:638
const KVNameValueList & GetParameters() const
Definition: KVVarGlob.h:326
virtual Double_t getvalue_void() const
Definition: KVVarGlob.h:289
void Fill2(const KVNucleus *n1, const KVNucleus *n2)
Definition: KVVarGlob.h:418
KVParticleCondition fSelection
(optional) condition used to select particles
Definition: KVVarGlob.h:249
virtual Bool_t IsGlobalVariable() const
Definition: KVVarGlob.h:385
KVNameValueList fParameters
list of parameters
Definition: KVVarGlob.h:248
virtual TString GetValueName(Int_t i) const
Definition: KVVarGlob.h:648
virtual Char_t GetValueType(Int_t) const
Definition: KVVarGlob.h:662
Int_t fMaxNumBranches
max number of branches to create for multi-valued variable
Definition: KVVarGlob.h:250
void SetFrame(const Char_t *ref)
Definition: KVVarGlob.h:503
virtual void Init()=0
virtual std::vector< Double_t > GetValueVector(void) const
Definition: KVVarGlob.h:471
int GetIndexAtListPosition(int pos) const
Definition: KVVarGlob.h:272
void SetSelection(const KVParticleCondition &sel)
Definition: KVVarGlob.h:594
void DefineNewFrame(KVEvent *e) const
Definition: KVVarGlob.h:731
static void AddExtraInitMethodComment(KVClassFactory &cf, KVString &body)
Definition: KVVarGlob.cpp:130
virtual void Reset()=0
Double_t GetNormalization() const
Definition: KVVarGlob.h:581
bool TestEventSelection() const
Definition: KVVarGlob.h:710
virtual ~KVVarGlob(void)
Definition: KVVarGlob.h:364
Bool_t IsNBody() const
Definition: KVVarGlob.h:379
virtual Double_t getvalue_char(const Char_t *name) const
Definition: KVVarGlob.h:294
Int_t fType
type of variable global; = kOneBody, kTwoBody or kNBody
Definition: KVVarGlob.h:241
Bool_t IsTwoBody() const
Definition: KVVarGlob.h:373
void SetDefineGroup(const KVString &groupname="")
Definition: KVVarGlob.cpp:333
Bool_t IsParameterSet(const Char_t *par)
Definition: KVVarGlob.h:567
Char_t fValueType
type (='I' integer or 'D' double) of global variable value
Definition: KVVarGlob.h:242
void UnsetParameter(const Char_t *par)
Definition: KVVarGlob.h:586
virtual const char * GetName() const
void AbstractMethod(const char *method) const
virtual void Fatal(const char *method, const char *msgfmt,...) const
const Int_t n