KaliVeda  1.12/06
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 
217 class KVVarGlob: public KVBase {
218 
219 public:
220  enum {
221  kOneBody, // one-body variable: Fill (KVNucleus*) must be defined
222  kTwoBody, // two-body variable: Fill2 (KVNucleus*, KVNucleus*) must be defined
223  kNBody // N-body variable: FillN (KVEvent*) must be defined
224  };
225 
226 protected:
229 private:
238 
239 #ifdef USING_ROOT6
240  using EventSelector = std::function<bool(const KVVarGlob*)>;
242  using FrameSetter = std::function<void(KVEvent*, const KVVarGlob*)>;
244 #endif
245 
246  void init();
247  static void AddExtraInitMethodComment(KVClassFactory& cf, KVString& body);
248 
249 protected:
250  void SetNameIndex(const Char_t* name, Int_t index);
252  {
254  nameList.Clear();
255  }
256  int GetIndexAtListPosition(int pos) const
257  {
259  return nameList.GetValue<int>(pos);
260  }
262  {
264  return nameList.GetNameAt(pos);
265  }
266 
267  static void FillMethodBody(KVString& body, int type);
268  static void AddInitMethod(KVClassFactory& cf, KVString& body);
269  static void ImplementInitMethod(KVClassFactory& cf, KVString& body, int type);
270  static void AddFillMethod(KVClassFactory& cf, int type);
271  static void AddFillMethodBody(KVClassFactory& cf, KVString& body, int type);
272 
273  virtual Double_t getvalue_void() const
274  {
276  return getvalue_int(0);
277  }
278  virtual Double_t getvalue_char(const Char_t* name) const
279  {
282 
283  return getvalue_int(GetNameIndex(name));
284  }
285  virtual Double_t getvalue_int(Int_t) const = 0;
286  virtual void fill(const KVNucleus*)
287  {
290  AbstractMethod("fill(KVNucleus*)");
291  }
292 
293  virtual void fill2(const KVNucleus*, const KVNucleus*)
294  {
303  AbstractMethod("fill2(KVNucleus*,KVNucleus*)");
304  }
305 
307  {
308  return fParameters;
309  }
311  {
312  return fParameters;
313  }
314 
315 public:
317  : KVBase("KVVarGlob", "KVVarGlob"), nameList("IndexList", "Correspondance variable name<->index")
318  {
319  init();
320  }
321  KVVarGlob(const Char_t* nom)
322  : KVBase(nom, nom), nameList("IndexList", "Correspondance variable name<->index")
323  {
324  init();
325  }
326  ROOT_COPY_CTOR(KVVarGlob, KVBase)
327  ROOT_COPY_ASSIGN_OP(KVVarGlob)
328  void Copy(TObject& obj) const
329  {
331  KVBase::Copy(obj);
332  KVVarGlob& vgobj = dynamic_cast<KVVarGlob&>(obj);
333  nameList.Copy(vgobj.nameList);
335  vgobj.fFrame = fFrame;
336  fOptions.Copy(vgobj.fOptions);
338  fSelection.Copy(vgobj.fSelection);
339  vgobj.fType = fType;
340  vgobj.fValueType = fValueType;
343 #ifdef USING_ROOT6
345  vgobj.fFrameSetter = fFrameSetter;
346 #endif
347  }
348  virtual ~KVVarGlob(void)
349  {}
350 
352  {
354  return fType == kOneBody;
355  }
356 
358  {
360  return fType == kTwoBody;
361  }
362 
363  Bool_t IsNBody() const
364  {
366  return fType == kNBody;
367  }
368 
369  virtual Bool_t IsGlobalVariable() const
370  {
371  return kTRUE;
372  }
373 
374  void ListInit()
375  {
378 
379  if (!fIsInitialized) {
380  Init();
382  }
383  }
384  virtual void Init() = 0;
385  virtual void Reset() = 0;
386  virtual void Calculate() = 0;
387 
388  void Fill(const KVNucleus* c)
389  {
393  const KVNucleus* c_in_frame = dynamic_cast<const KVNucleus*>(c->GetFrame(fFrame, false));
394  if (fSelection.Test(c_in_frame)) fill(c_in_frame);
395  }
396  void Fill2(const KVNucleus* n1, const KVNucleus* n2)
397  {
401  const KVNucleus* n1_in_frame = dynamic_cast<const KVNucleus*>(n1->GetFrame(fFrame, false));
402  const KVNucleus* n2_in_frame = dynamic_cast<const KVNucleus*>(n2->GetFrame(fFrame, false));
403  if (fSelection.Test(n1_in_frame) && fSelection.Test(n2_in_frame))
404  fill2(n1_in_frame, n2_in_frame);
405  }
406  virtual void FillN(const KVEvent*)
407  {
410  AbstractMethod("FillN(KVEvent*)");
411  }
412  Double_t GetValue(void) const
413  {
419 
420  return getvalue_void() / fNormalization;
421  }
422  Double_t GetValue(const Char_t* name) const
423  {
429 
430  return getvalue_char(name) / fNormalization;
431  }
433  {
439 
440  return getvalue_int(i) / fNormalization;
441  }
442  virtual std::vector<Double_t> GetValueVector(void) const
443  {
449 
450  std::vector<Double_t> tmp;
451  for (int i = 0; i < GetNumberOfValues(); ++i) tmp.push_back(GetValue(i) / fNormalization);
452  return tmp;
453  }
454 
455  Double_t operator()(void) const
456  {
457  return GetValue();
458  }
459 
460  Double_t operator()(const Char_t* name) const
461  {
462  return GetValue(name);
463  }
464 
466  {
467  return GetValue(i);
468  }
469 
470  Int_t GetNameIndex(const Char_t* name) const;
471 
472  static void MakeClass(const Char_t* classname, const Char_t* classdesc, int type = kOneBody);
473 
474  void SetFrame(const Char_t* ref)
475  {
483  fFrame = ref;
484  }
485  const TString& GetFrame() const
486  {
487  return fFrame;
488  }
489 
490  void SetOption(const Char_t* option, const Char_t* value)
491  {
493  KVString tmp(value);
494  fOptions.SetValue(option, tmp);
495  fIsInitialized = kFALSE; //allow re-initialisation
496  }
497 
499  {
501 
502  return fOptions.HasParameter(opt);
503  }
504 
505  TString GetOptionString(const Char_t* opt) const
506  {
508 
509  return fOptions.GetTStringValue(opt);
510  }
511  void UnsetOption(const Char_t* opt)
512  {
514 
516  }
517 
518  void SetParameter(const Char_t* par, Double_t value)
519  {
521 
522  TString Par(par);
525  if (Par == "Zmin" || Par == "Zmax" || Par == "Vmin" || Par == "Vmax")
526  Fatal("SetParameter", "Particle selection for global variables must be defined using SetSelection(const KVParticleCondition&).\nUpdate the use of variable \"%s\" in your analysis.",
527  GetName());
528  if (Par == "Normalization") fNormalization = value;
529  else fParameters.SetValue(par, value);
530  fIsInitialized = kFALSE; //allow re-initialisation
531  }
532 
534  {
535  fNormalization = norm;
536  }
537 
539  {
541  if (TString(par) == "Normalization") return (fNormalization != 1.0);
542  return fParameters.HasParameter(par);
543  }
544 
545  Double_t GetParameter(const Char_t* par) const
546  {
548  if (TString(par) == "Normalization") return fNormalization;
549  return fParameters.GetDoubleValue(par);
550  }
551 
553  {
554  return fNormalization;
555  }
556 
557  void UnsetParameter(const Char_t* par)
558  {
560 
561  if (TString(par) == "Normalization") fNormalization = 1.0;
563  }
564 
566  {
577 
578  fSelection = sel;
579  }
580 
582  {
590 
591  fSelection &= sel;
592  }
593 
595  {
596  return GetValue();
597  }
598  operator double() const
599  {
600  return AsDouble();
601  }
602 
603  virtual Int_t GetNumberOfValues() const
604  {
607  return nameList.GetNpar();
608  }
610  {
618  }
619  virtual TString GetValueName(Int_t i) const
620  {
623  for (int j = 0; j < GetNumberOfValues(); j++) {
624  if (nameList.GetIntValue(j) == i) return nameList.GetParameter(j)->GetName();
625  }
626  return TString("unknown");
627  }
628  virtual Char_t GetValueType(Int_t) const
629  {
637 
638  return fValueType;
639  }
641  {
651  fMaxNumBranches = (n <= GetNumberOfValues() ? n : -1);
652  }
653  void Print(Option_t* = "") const;
654 
655 #ifdef USING_ROOT6
657  {
674  fEventSelector = f;
675  }
676  bool TestEventSelection() const
677  {
681 
682  if (!fEventSelector) return true;
683  bool result = fEventSelector(this);
684  return result;
685  }
687  {
695  fFrameSetter = f;
696  }
697  void DefineNewFrame(KVEvent* e) const
698  {
702  if (fFrameSetter) fFrameSetter(e, this);
703  }
704 #endif
705 
706  ClassDef(KVVarGlob, 7) // Base class for global variables
707 };
708 #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:135
virtual void Copy(TObject &) const
Make a copy of this object.
Definition: KVBase.cpp:397
Factory class for generating skeleton files for new classes.
Base class container for multi-particle events.
Definition: KVEvent.h:176
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
Handles particle selection criteria for data analysis classes ,.
Bool_t Test(const KVNucleus *nuc) const
void Copy(TObject &) const
Copy this to obj.
KVParticle const * GetFrame(const Char_t *frame, Bool_t warn_and_return_null_if_unknown=kTRUE) const
Definition: KVParticle.cpp:952
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
Definition: KVString.h:72
Base class for all global variable implementations.
Definition: KVVarGlob.h:217
void SetOption(const Char_t *option, const Char_t *value)
Definition: KVVarGlob.h:490
KVNameValueList & GetParameters()
Definition: KVVarGlob.h:306
KVVarGlob(const Char_t *nom)
Definition: KVVarGlob.h:321
Double_t GetValue(const Char_t *name) const
Definition: KVVarGlob.h:422
void SetNormalization(Double_t norm)
Definition: KVVarGlob.h:533
void ListInit()
Definition: KVVarGlob.h:374
static void AddInitMethod(KVClassFactory &cf, KVString &body)
Definition: KVVarGlob.cpp:148
void Print(Option_t *="") const
Definition: KVVarGlob.cpp:276
Double_t operator()(void) const
Definition: KVVarGlob.h:455
virtual void Calculate()=0
Bool_t IsOneBody() const
Definition: KVVarGlob.h:351
Double_t fNormalization
optional normalization parameter
Definition: KVVarGlob.h:237
virtual Int_t GetNumberOfValues() const
Definition: KVVarGlob.h:603
Double_t GetValue(void) const
Definition: KVVarGlob.h:412
KVString fFrame
(optional) name of reference frame used for kinematics
Definition: KVVarGlob.h:232
void Copy(TObject &obj) const
Make a copy of this object.
Definition: KVVarGlob.h:328
KVNameValueList fOptions
list of options
Definition: KVVarGlob.h:233
Double_t AsDouble() const
Definition: KVVarGlob.h:594
void SetNameIndex(const Char_t *name, Int_t index)
Definition: KVVarGlob.cpp:223
void SetNewFrameDefinition(const FrameSetter &f)
Definition: KVVarGlob.h:686
Double_t GetValue(Int_t i) const
Definition: KVVarGlob.h:432
const TString & GetFrame() const
Definition: KVVarGlob.h:485
void SetMaxNumBranches(Int_t n)
Definition: KVVarGlob.h:640
void ClearNameIndex()
Definition: KVVarGlob.h:251
Int_t GetNameIndex(const Char_t *name) const
Definition: KVVarGlob.cpp:254
void SetParameter(const Char_t *par, Double_t value)
Definition: KVVarGlob.h:518
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:241
FrameSetter fFrameSetter
used to define a new kinematical frame for event based on variable
Definition: KVVarGlob.h:243
void UnsetOption(const Char_t *opt)
Definition: KVVarGlob.h:511
virtual void fill2(const KVNucleus *, const KVNucleus *)
Definition: KVVarGlob.h:293
void Fill(const KVNucleus *c)
Definition: KVVarGlob.h:388
TString GetOptionString(const Char_t *opt) const
Definition: KVVarGlob.h:505
std::function< bool(const KVVarGlob *)> EventSelector
Definition: KVVarGlob.h:240
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:465
Bool_t IsOptionGiven(const Char_t *opt)
Definition: KVVarGlob.h:498
std::function< void(KVEvent *, const KVVarGlob *)> FrameSetter
Definition: KVVarGlob.h:242
virtual void FillN(const KVEvent *)
Definition: KVVarGlob.h:406
Bool_t fIsInitialized
flag set after initialisation
Definition: KVVarGlob.h:231
static void AddFillMethod(KVClassFactory &cf, int type)
Definition: KVVarGlob.cpp:164
void AddSelection(const KVParticleCondition &sel)
Definition: KVVarGlob.h:581
virtual void fill(const KVNucleus *)
Definition: KVVarGlob.h:286
Double_t operator()(const Char_t *name) const
Definition: KVVarGlob.h:460
Double_t GetParameter(const Char_t *par) const
Definition: KVVarGlob.h:545
void SetEventSelection(const EventSelector &f)
Definition: KVVarGlob.h:656
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:261
KVNameValueList nameList
correspondence between variable name and index
Definition: KVVarGlob.h:230
Int_t GetNumberOfBranches() const
Definition: KVVarGlob.h:609
const KVNameValueList & GetParameters() const
Definition: KVVarGlob.h:310
virtual Double_t getvalue_void() const
Definition: KVVarGlob.h:273
void Fill2(const KVNucleus *n1, const KVNucleus *n2)
Definition: KVVarGlob.h:396
KVParticleCondition fSelection
(optional) condition used to select particles
Definition: KVVarGlob.h:235
virtual Bool_t IsGlobalVariable() const
Definition: KVVarGlob.h:369
KVNameValueList fParameters
list of parameters
Definition: KVVarGlob.h:234
virtual TString GetValueName(Int_t i) const
Definition: KVVarGlob.h:619
virtual Char_t GetValueType(Int_t) const
Definition: KVVarGlob.h:628
Int_t fMaxNumBranches
max number of branches to create for multi-valued variable
Definition: KVVarGlob.h:236
void SetFrame(const Char_t *ref)
Definition: KVVarGlob.h:474
virtual void Init()=0
virtual std::vector< Double_t > GetValueVector(void) const
Definition: KVVarGlob.h:442
int GetIndexAtListPosition(int pos) const
Definition: KVVarGlob.h:256
void SetSelection(const KVParticleCondition &sel)
Definition: KVVarGlob.h:565
void DefineNewFrame(KVEvent *e) const
Definition: KVVarGlob.h:697
static void AddExtraInitMethodComment(KVClassFactory &cf, KVString &body)
Definition: KVVarGlob.cpp:130
virtual void Reset()=0
Double_t GetNormalization() const
Definition: KVVarGlob.h:552
bool TestEventSelection() const
Definition: KVVarGlob.h:676
virtual ~KVVarGlob(void)
Definition: KVVarGlob.h:348
Bool_t IsNBody() const
Definition: KVVarGlob.h:363
virtual Double_t getvalue_char(const Char_t *name) const
Definition: KVVarGlob.h:278
Int_t fType
type of variable global; = kOneBody, kTwoBody or kNBody
Definition: KVVarGlob.h:227
Bool_t IsTwoBody() const
Definition: KVVarGlob.h:357
Bool_t IsParameterSet(const Char_t *par)
Definition: KVVarGlob.h:538
Char_t fValueType
type (='I' integer or 'D' double) of global variable value
Definition: KVVarGlob.h:228
void UnsetParameter(const Char_t *par)
Definition: KVVarGlob.h:557
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