10 #ifndef __KVTEMPLATEPARTICLECONDITION_H
11 #define __KVTEMPLATEPARTICLECONDITION_H
15 #include "KVHashList.h"
18 #include <KVClassFactory.h>
66 template<
typename ParticleType>
69 mutable Int_t fNUsing;
70 using LambdaFunc = std::function<bool(
const ParticleType*)>;
71 mutable LambdaFunc fLambdaCondition;
72 LambdaFunc fSavedLambda1, fSavedLambda2;
73 enum class LogOp { AND, OR } fOpType;
75 void logical_operator_lambda_condition_test()
const
81 fLambdaCondition = [
this](
const ParticleType * nuc) {
82 return (fSavedLambda1(nuc) && fSavedLambda2(nuc));
86 fLambdaCondition = [
this](
const ParticleType * nuc) {
87 return (fSavedLambda1(nuc) || fSavedLambda2(nuc));
106 void Optimize()
const
128 Info(
"Optimize",
"Optimization of KVParticleCondition : %s", fCondition.
Data());
130 CreateClassFactory();
133 cf->
AddMethod(
"optimized_test",
"Bool_t",
"public",
false,
true);
138 KVString body(
" //Optimized Test method for particle condition\n");
140 if (fClassName !=
"") {
141 pointer.
Form(
"((%s*)nuc)", fClassName.
Data());
162 KVError::Error(
this,
"Optimize",
" *** Optimization failed for KVParticleCondition : %s", fCondition.
Data());
163 KVError::Error(
this,
"Optimize",
" *** Use method AddExtraInclude(const Char_t*) to give the names of all necessary header files for compilation of your condition.");
164 Fatal(
"Optimize",
" *** THIS CONDITION WILL BE EVALUATED AS kFALSE FOR ALL PARTICLES!!!");
179 Info(
"Optimize",
"fOptimal = %p", fOptimal);
181 KVError::Error(
this,
"Optimize",
" *** Optimization failed for KVParticleCondition : %s", fCondition.
Data());
182 KVError::Error(
this,
"Optimize",
" *** Use method AddExtraInclude(const Char_t*) to give the names of all necessary header files for compilation of your condition.");
183 Fatal(
"Optimize",
" *** THIS CONDITION WILL BE EVALUATED AS kFALSE FOR ALL PARTICLES!!!");
194 Info(
"Optimize",
"Success");
197 virtual bool optimized_test(
const ParticleType*)
const
201 void CreateClassFactory()
const
212 new_class.
Prepend(
"KVParticleCondition_");
215 cf =
new KVClassFactory(new_class.
Data(),
"Particle condition to test",
"KVParticleCondition");
223 CreateClassFactory();
229 :
KVBase(
"KVParticleCondition",
"Particle selection criteria")
239 :
KVBase(cond,
"KVParticleCondition")
268 :
KVBase(cond,
"KVParticleCondition")
297 :
KVBase(
"KVParticleCondition",
"Particle selection criteria")
308 :
KVBase(
name,
"KVParticleCondition"), fLambdaCondition(
F)
341 return (
bool)fLambdaCondition || ((bool)fSavedLambda1 && (
bool)fSavedLambda2);
349 --(fOptimal->fNUsing);
350 if (!(fOptimal->fNUsing)) {
371 fLambdaCondition =
F;
392 fCondition_raw = fCondition;
398 fCondition_brackets =
"(" + fCondition_raw +
")";
411 logical_operator_lambda_condition_test();
413 if (
IsLambda())
return fLambdaCondition(nuc);
414 if (!fOptimal) Optimize();
416 return (fOptOK ? fOptimal->optimized_test(nuc) :
kFALSE);
467 CreateClassFactory();
495 if (&obj !=
this) obj.
Copy(*
this);
524 fLambdaCondition =
f;
540 A.logical_operator_lambda_condition_test();
541 B.logical_operator_lambda_condition_test();
556 tmp.fSavedLambda1 = A.fLambdaCondition;
557 tmp.fSavedLambda2 = B.fLambdaCondition;
558 tmp.fOpType = KVTemplateParticleCondition::LogOp::AND;
563 ::Error(
"KVTemplateParticleCondition::operator&&",
"Both KVParticleCondition objects must use lambda captures in order to do this");
568 tmp.
Set(A.fCondition_brackets +
" && " + B.fCondition_brackets);
586 A.logical_operator_lambda_condition_test();
587 B.logical_operator_lambda_condition_test();
602 tmp.fSavedLambda1 = A.fLambdaCondition;
603 tmp.fSavedLambda2 = B.fLambdaCondition;
604 tmp.fOpType = KVTemplateParticleCondition::LogOp::OR;
609 ::Error(
"operator&&",
"Both KVParticleCondition objects must use lambda captures in order to do this");
614 tmp.
Set(A.fCondition_brackets +
" || " + B.fCondition_brackets);
646 if (fCondition !=
"") {
647 Info(
"Print",
"object name = %s, address = %p",
GetName(),
this);
648 std::cout <<
" * condition = " << fCondition.
Data() << std::endl;
649 std::cout <<
" * classname = " << fClassName.
Data() << std::endl;
650 std::cout <<
" * fOptimal = " << fOptimal << std::endl;
651 std::cout <<
" * fNUsing = " << fNUsing << std::endl;
653 std::cout <<
" * classfactory :" << std::endl;
658 std::cout <<
GetName() << std::endl;
672 return (fLambdaCondition || fCondition !=
"");
678 template<
typename ParticleClass>
#define ClassDef(name, id)
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t sel
char * Form(const char *fmt,...)
Base class for KaliVeda framework.
void Copy(TObject &) const override
Make a copy of this object.
static TPluginHandler * LoadPlugin(const Char_t *base, const Char_t *uri="0")
Factory class for generating skeleton files for new classes.
void Print(Option_t *opt="") const override
Print infos on object.
void Copy(TObject &obj) const override
Copy the state of this KVClassFactory to the one referenced by 'obj'.
void GenerateCode()
Generate header and implementation file for currently-defined class.
void SetInheritAllConstructors(Bool_t yes=kTRUE)
const Char_t * GetImpFileName() const
void AddHeaderIncludeFile(const Char_t *filename)
void AddImplIncludeFile(const Char_t *filename)
const Char_t * GetClassName() const
void AddMethodBody(const Char_t *method_name, const KVString &body)
void AddMethodArgument(const Char_t *method_name, const Char_t *argument_type, const Char_t *argument_name="", const Char_t *default_value="")
KVClassMethod * AddMethod(const Char_t *name, const Char_t *return_type, const Char_t *access="public", Bool_t isVirtual=kFALSE, Bool_t isConst=kFALSE)
Extended version of ROOT THashList.
TObject * Remove(TObject *obj) override
Remove object from list.
void Add(TObject *obj) override
TObject * FindObject(const char *name) const override
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
An object for handling particle selection.
friend KVTemplateParticleCondition operator||(const KVTemplateParticleCondition &A, const KVTemplateParticleCondition &B)
void Copy(TObject &obj) const
KVTemplateParticleCondition & operator&=(const KVTemplateParticleCondition &other)
void Set(const KVString &cond)
KVTemplateParticleCondition(const Char_t *cond)
friend KVTemplateParticleCondition operator&&(const KVTemplateParticleCondition &A, const KVTemplateParticleCondition &B)
Bool_t Test(const ParticleType *nuc) const
KVTemplateParticleCondition()
KVTemplateParticleCondition(const KVTemplateParticleCondition &obj)
Bool_t Test(const ParticleType &nuc) const
void Set(const KVString &name, const LambdaFunc &F)
void AddExtraInclude(const Char_t *inc_file)
~KVTemplateParticleCondition()
KVTemplateParticleCondition & operator=(const KVTemplateParticleCondition &obj)
KVTemplateParticleCondition(const KVString &cond)
void SetParticleClassName(const Char_t *cl)
KVTemplateParticleCondition & operator=(const KVString &sel)
static void PrintOptimizedList()
KVTemplateParticleCondition(const KVString &name, const LambdaFunc &F)
KVTemplateParticleCondition & operator=(const LambdaFunc &f)
void Print(Option_t *opt="") const
KVTemplateParticleCondition & operator|=(const KVTemplateParticleCondition &other)
virtual void Print(Option_t *option, const char *wildcard, Int_t recurse=1) const
const char * GetName() const override
virtual void SetName(const char *name)
virtual void Error(const char *method, const char *msgfmt,...) const
virtual void Fatal(const char *method, const char *msgfmt,...) const
virtual void Info(const char *method, const char *msgfmt,...) const
Longptr_t ExecPlugin(int nargs)
TSubString Strip(EStripType s=kTrailing, char c=' ') const
const char * Data() const
TString & Prepend(char c, Ssiz_t rep=1)
void Form(const char *fmt,...)
TString & Remove(EStripType s, char c)
TString & ReplaceAll(const char *s1, const char *s2)
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
const char * AsString() const
void Error(UserClass p, const char *location, const char *va_(fmt),...)