22 #pragma optimize("",off)
25 static TVirtualMutex* gTFormulaPrimativeListMutex = 0;
28 ClassImp(ROOT::v5::TFormulaPrimitive);
33 void TMath_GenerInterface();
66 TObjArray * TFormulaPrimitive::fgListOfFunction = 0;
67 #ifdef R__COMPLETE_MEM_TERMINATION
69 class TFormulaPrimitiveCleanup {
70 TObjArray **fListOfFunctions;
72 TFormulaPrimitiveCleanup(TObjArray **functions) : fListOfFunctions(functions) {}
73 ~TFormulaPrimitiveCleanup() {
74 delete *fListOfFunctions;
84 TFormulaPrimitive::TFormulaPrimitive() : TNamed(),
86 fType(0),fNArguments(0),fNParameters(0),fIsStatic(kTRUE)
93 TFormulaPrimitive::TFormulaPrimitive(
const char *name,
const char *formula,
94 GenFunc0 fpointer) : TNamed(name,formula),
96 fType(0),fNArguments(0),fNParameters(0),fIsStatic(kTRUE)
103 TFormulaPrimitive::TFormulaPrimitive(
const char *name,
const char *formula,
104 GenFunc10 fpointer) : TNamed(name,formula),
106 fType(10),fNArguments(1),fNParameters(0),fIsStatic(kTRUE)
113 TFormulaPrimitive::TFormulaPrimitive(
const char *name,
const char *formula,
114 GenFunc110 fpointer) : TNamed(name,formula),
116 fType(110),fNArguments(2),fNParameters(0),fIsStatic(kTRUE)
123 TFormulaPrimitive::TFormulaPrimitive(
const char *name,
const char *formula,
124 GenFunc1110 fpointer) : TNamed(name,formula),
126 fType(1110),fNArguments(3),fNParameters(0),fIsStatic(kTRUE)
133 TFormulaPrimitive::TFormulaPrimitive(
const char *name,
const char *formula,
134 GenFuncG fpointer,Int_t npar) : TNamed(name,formula),
136 fType(-1),fNArguments(2),fNParameters(npar),fIsStatic(kTRUE)
143 TFormulaPrimitive::TFormulaPrimitive(
const char *name,
const char *formula,
144 TFuncG fpointer) : TNamed(name,formula),
146 fType(0),fNArguments(0),fNParameters(0),fIsStatic(kFALSE)
153 TFormulaPrimitive::TFormulaPrimitive(
const char *name,
const char *formula,
154 TFunc0 fpointer) : TNamed(name,formula),
156 fType(0),fNArguments(0),fNParameters(0),fIsStatic(kFALSE)
163 TFormulaPrimitive::TFormulaPrimitive(
const char *name,
const char *formula,
164 TFunc10 fpointer) : TNamed(name,formula),
166 fType(-10),fNArguments(1),fNParameters(0),fIsStatic(kFALSE)
173 TFormulaPrimitive::TFormulaPrimitive(
const char *name,
const char *formula,
174 TFunc110 fpointer) : TNamed(name,formula),
176 fType(-110),fNArguments(2),fNParameters(0),fIsStatic(kFALSE)
183 TFormulaPrimitive::TFormulaPrimitive(
const char *name,
const char *formula,
184 TFunc1110 fpointer) :TNamed(name,formula),
185 fTFunc1110(fpointer),
186 fType(-1110),fNArguments(3),fNParameters(0),fIsStatic(kFALSE)
194 Int_t TFormulaPrimitive::AddFormula(TFormulaPrimitive * formula)
196 R__LOCKGUARD2(gTFormulaPrimativeListMutex);
197 if (fgListOfFunction == 0) BuildBasicFormulas();
198 if (FindFormula(formula->GetName(),formula->fNArguments)){
202 fgListOfFunction->AddLast(formula);
209 Double_t TFormulaPrimitive::Eval(Double_t* x)
211 if (fIsStatic == kFALSE)
return 0;
213 if (fType==0)
return fFunc0();
215 return fFunc10(x[0]);
218 return fFunc110(x[0],x[1]);
221 return fFunc1110(x[0],x[1],x[2]);
229 Double_t TFormulaPrimitive::Eval(TObject *o, Double_t *x)
231 if (fIsStatic == kTRUE)
return 0;
232 if (fType== 0)
return (*o.*fTFunc0)();
233 if (fType==-10)
return (*o.*fTFunc10)(*x);
234 if (fType==-110)
return (*o.*fTFunc110)(x[0],x[1]);
235 if (fType==-1110)
return (*o.*fTFunc1110)(x[0],x[1],x[2]);
242 Double_t TFormulaPrimitive::Eval(Double_t *x, Double_t *param)
244 return fFuncG(x,param);
247 #define RTFastFun__POLY(var) \
249 Double_t res= param[var-1]+param[var]*x[0]; \
250 for (Int_t j=var-1 ;j>0;j--) res = param[j-1]+x[0]*res; \
259 Double_t Pow2(Double_t x){
return x*x;}
260 Double_t Pow3(Double_t x){
return x*x*x;}
261 Double_t Pow4(Double_t x){
return x*x*x*x;}
262 Double_t Pow5(Double_t x){
return x*x*x*x*x;}
263 inline Double_t FPoln(Double_t *x, Double_t *param, Int_t npar);
264 Double_t FPol0(Double_t * , Double_t *param){
return param[0];}
265 Double_t FPol1(Double_t *x, Double_t *param){
return param[0]+param[1]*x[0];}
266 Double_t FPol2(Double_t *x, Double_t *param){
return param[0]+x[0]*(param[1]+param[2]*x[0]);}
267 Double_t FPol3(Double_t *x, Double_t *param){
return param[0]+x[0]*(param[1]+x[0]*(param[2]+param[3]*x[0]));}
268 Double_t FPol4(Double_t *x, Double_t *param){ RTFastFun__POLY(4)}
269 Double_t FPol5(Double_t *x, Double_t *param){ RTFastFun__POLY(5)}
270 Double_t FPol6(Double_t *x, Double_t *param){ RTFastFun__POLY(6)}
271 Double_t FPol7(Double_t *x, Double_t *param){ RTFastFun__POLY(7)}
272 Double_t FPol8(Double_t *x, Double_t *param){ RTFastFun__POLY(8)}
273 Double_t FPol9(Double_t *x, Double_t *param){ RTFastFun__POLY(9)}
274 Double_t FPol10(Double_t *x, Double_t *param){ RTFastFun__POLY(10)}
277 Double_t PlusXY(Double_t x,Double_t y){
return x+y;}
278 Double_t MinusXY(Double_t x,Double_t y){
return x-y;}
279 Double_t MultXY(Double_t x,Double_t y){
return x*y;}
280 Double_t DivXY(Double_t x, Double_t y){
return TMath::Abs(y)>0 ? x/y:0;}
281 Double_t XpYpZ(Double_t x, Double_t y, Double_t z){
return x+y+z;}
282 Double_t XxYxZ(Double_t x, Double_t y, Double_t z){
return x*y*z;}
283 Double_t XxYpZ(Double_t x, Double_t y, Double_t z){
return x*(y+z);}
284 Double_t XpYxZ(Double_t x, Double_t y, Double_t z){
return x+(y*z);}
285 Double_t Gaus(Double_t x, Double_t mean, Double_t sigma);
286 Double_t Gausn(Double_t x, Double_t mean, Double_t sigma);
287 Double_t Landau(Double_t x, Double_t mean, Double_t sigma){
return TMath::Landau(x,mean,sigma,kFALSE);}
288 Double_t Landaun(Double_t x, Double_t mean, Double_t sigma){
return TMath::Landau(x,mean,sigma,kTRUE);}
289 Double_t Sqrt(Double_t x) {
return x>0?sqrt(x):0;}
291 Double_t Sign(Double_t x){
return (x<0)? -1:1;}
292 Double_t Nint(Double_t x){
return TMath::Nint(x);}
293 Double_t Abs(Double_t x){
return TMath::Abs(x);}
295 Double_t XandY(Double_t x, Double_t y){
return (x*y>0.1);}
296 Double_t XorY(Double_t x, Double_t y) {
return (x+y>0.1);}
297 Double_t XgY(Double_t x, Double_t y) {
return (x>y);}
298 Double_t XgeY(Double_t x, Double_t y) {
return (x>=y);}
299 Double_t XlY(Double_t x, Double_t y) {
return (x<y);}
300 Double_t XleY(Double_t x, Double_t y) {
return (x<=y);}
301 Double_t XeY(Double_t x,Double_t y) {
return (x==y);}
302 Double_t XneY(Double_t x,Double_t y) {
return (x!=y);}
303 Double_t XNot(Double_t x){
return (x<0.1);}
309 TFormulaPrimitive* TFormulaPrimitive::FindFormula(
const char* name)
311 R__LOCKGUARD2(gTFormulaPrimativeListMutex);
312 if (!fgListOfFunction) {
313 BuildBasicFormulas();
315 Int_t nobjects = fgListOfFunction->GetEntries();
316 for (Int_t i = 0; i < nobjects; ++i) {
317 TFormulaPrimitive *formula = (TFormulaPrimitive*)fgListOfFunction->At(i);
318 if (formula && 0==strcmp(name, formula->GetName()))
return formula;
326 TFormulaPrimitive* TFormulaPrimitive::FindFormula(
const char* name, UInt_t nargs)
328 R__LOCKGUARD2(gTFormulaPrimativeListMutex);
329 if (!fgListOfFunction) {
330 BuildBasicFormulas();
332 Int_t nobjects = fgListOfFunction->GetEntries();
333 for (Int_t i = 0; i < nobjects; ++i) {
334 TFormulaPrimitive *prim = (TFormulaPrimitive*)fgListOfFunction->At(i);
336 bool match = ( ((UInt_t)prim->fNArguments) == nargs );
337 if (match && 0==strcmp(name, prim->GetName()))
return prim;
346 TFormulaPrimitive* TFormulaPrimitive::FindFormula(
const char* name,
const char *args)
354 for(UInt_t c = 0; c < strlen(args); ++c ) {
356 case '(': ++nest;
break;
357 case ')': --nest;
break;
358 case '<': ++nest;
break;
359 case '>': --nest;
break;
360 case ',': nargs += (nest==0);
break;
364 return FindFormula(name,nargs);
366 return FindFormula(name);
374 Double_t TFastFun::FPoln(Double_t *x, Double_t *param, Int_t npar)
376 Double_t res = 0; Double_t temp=1;
377 for (Int_t j=npar ;j>=0;j--) {
378 res += temp*param[j];
387 Double_t TFastFun::Gaus(Double_t x, Double_t mean, Double_t sigma)
389 if (sigma == 0)
return 1.e30;
390 Double_t arg = (x-mean)/sigma;
391 return TMath::Exp(-0.5*arg*arg);
397 Double_t TFastFun::Gausn(Double_t x, Double_t mean, Double_t sigma)
399 if (sigma == 0)
return 0;
400 Double_t arg = (x-mean)/sigma;
401 return TMath::Exp(-0.5*arg*arg)/(2.50662827463100024*sigma);
407 Int_t TFormulaPrimitive::BuildBasicFormulas()
409 R__LOCKGUARD2(gTFormulaPrimativeListMutex);
410 if (fgListOfFunction==0) {
411 fgListOfFunction =
new TObjArray(1000);
412 fgListOfFunction->SetOwner(kTRUE);
414 #ifdef R__COMPLETE_MEM_TERMINATION
415 static TFormulaPrimitiveCleanup gCleanup(&fgListOfFunction);
421 AddFormula(
new TFormulaPrimitive(
"XandY",
"XandY",TFastFun::XandY));
422 AddFormula(
new TFormulaPrimitive(
"XorY",
"XorY",TFastFun::XorY));
423 AddFormula(
new TFormulaPrimitive(
"XNot",
"XNot",TFastFun::XNot));
424 AddFormula(
new TFormulaPrimitive(
"XlY",
"XlY",TFastFun::XlY));
425 AddFormula(
new TFormulaPrimitive(
"XleY",
"XleY",TFastFun::XleY));
426 AddFormula(
new TFormulaPrimitive(
"XgY",
"XgY",TFastFun::XgY));
427 AddFormula(
new TFormulaPrimitive(
"XgeY",
"XgeY",TFastFun::XgeY));
428 AddFormula(
new TFormulaPrimitive(
"XeY",
"XeY",TFastFun::XeY));
429 AddFormula(
new TFormulaPrimitive(
"XneY",
"XneY",TFastFun::XneY));
431 AddFormula(
new TFormulaPrimitive(
"PlusXY",
"PlusXY",TFastFun::PlusXY));
432 AddFormula(
new TFormulaPrimitive(
"MinusXY",
"MinusXY",TFastFun::MinusXY));
433 AddFormula(
new TFormulaPrimitive(
"MultXY",
"MultXY",TFastFun::MultXY));
434 AddFormula(
new TFormulaPrimitive(
"DivXY",
"DivXY",TFastFun::DivXY));
435 AddFormula(
new TFormulaPrimitive(
"XpYpZ",
"XpYpZ",TFastFun::XpYpZ));
436 AddFormula(
new TFormulaPrimitive(
"XxYxZ",
"XxYxZ",TFastFun::XxYxZ));
437 AddFormula(
new TFormulaPrimitive(
"XxYpZ",
"XxYpZ",TFastFun::XxYpZ));
438 AddFormula(
new TFormulaPrimitive(
"XpYxZ",
"XpYxZ",TFastFun::XpYxZ));
441 AddFormula(
new TFormulaPrimitive(
"Gaus",
"Gaus",TFastFun::Gaus));
442 AddFormula(
new TFormulaPrimitive(
"Gausn",
"Gausn",TFastFun::Gausn));
443 AddFormula(
new TFormulaPrimitive(
"Landau",
"Landau",TFastFun::Landau));
444 AddFormula(
new TFormulaPrimitive(
"Landaun",
"Landaun",TFastFun::Landaun));
450 AddFormula(
new TFormulaPrimitive(
"Pol0",
"Pol0",(GenFuncG)TFastFun::FPol0,1));
451 AddFormula(
new TFormulaPrimitive(
"Pol1",
"Pol1",(GenFuncG)TFastFun::FPol1,2));
452 AddFormula(
new TFormulaPrimitive(
"Pol2",
"Pol2",(GenFuncG)TFastFun::FPol2,3));
453 AddFormula(
new TFormulaPrimitive(
"Pol3",
"Pol3",(GenFuncG)TFastFun::FPol3,4));
454 AddFormula(
new TFormulaPrimitive(
"Pol4",
"Pol4",(GenFuncG)TFastFun::FPol4,5));
455 AddFormula(
new TFormulaPrimitive(
"Pol5",
"Pol5",(GenFuncG)TFastFun::FPol5,6));
456 AddFormula(
new TFormulaPrimitive(
"Pol6",
"Pol6",(GenFuncG)TFastFun::FPol6,7));
457 AddFormula(
new TFormulaPrimitive(
"Pol7",
"Pol7",(GenFuncG)TFastFun::FPol7,8));
458 AddFormula(
new TFormulaPrimitive(
"Pol8",
"Pol8",(GenFuncG)TFastFun::FPol8,9));
459 AddFormula(
new TFormulaPrimitive(
"Pol9",
"Pol9",(GenFuncG)TFastFun::FPol9,10));
460 AddFormula(
new TFormulaPrimitive(
"Pol10",
"Pol10",(GenFuncG)TFastFun::FPol10,11));
463 AddFormula(
new TFormulaPrimitive(
"Pow2",
"Pow2",TFastFun::Pow2));
464 AddFormula(
new TFormulaPrimitive(
"Pow3",
"Pow3",TFastFun::Pow3));
465 AddFormula(
new TFormulaPrimitive(
"Pow4",
"Pow4",TFastFun::Pow4));
466 AddFormula(
new TFormulaPrimitive(
"Pow5",
"Pow5",TFastFun::Pow5));
469 AddFormula(
new TFormulaPrimitive(
"TMath::Cos",
"TMath::Cos",cos));
470 AddFormula(
new TFormulaPrimitive(
"cos",
"cos",cos));
471 AddFormula(
new TFormulaPrimitive(
"TMath::Sin",
"TMath::Sin",sin));
472 AddFormula(
new TFormulaPrimitive(
"sin",
"sin",sin));
473 AddFormula(
new TFormulaPrimitive(
"TMath::Tan",
"TMath::Tan",tan));
474 AddFormula(
new TFormulaPrimitive(
"tan",
"tan",tan));
475 AddFormula(
new TFormulaPrimitive(
"TMath::ACos",
"TMath::ACos",acos));
476 AddFormula(
new TFormulaPrimitive(
"acos",
"acos",acos));
477 AddFormula(
new TFormulaPrimitive(
"TMath::ASin",
"TMath::ASin",asin));
478 AddFormula(
new TFormulaPrimitive(
"asin",
"asin",asin));
479 AddFormula(
new TFormulaPrimitive(
"TMath::ATan",
"TMath::ATan",atan));
480 AddFormula(
new TFormulaPrimitive(
"atan",
"atan",atan));
481 AddFormula(
new TFormulaPrimitive(
"TMath::ATan2",
"TMath::ATan2",atan2));
482 AddFormula(
new TFormulaPrimitive(
"atan2",
"atan2",atan2));
484 AddFormula(
new TFormulaPrimitive(
"pow",
"pow",TMath::Power));
485 AddFormula(
new TFormulaPrimitive(
"sq",
"sq",TFastFun::Pow2));
486 AddFormula(
new TFormulaPrimitive(
"sqrt",
"sqrt",TFastFun::Sqrt));
488 AddFormula(
new TFormulaPrimitive(
"min",
"min",(GenFunc110)TMath::Min));
489 AddFormula(
new TFormulaPrimitive(
"max",
"max",(GenFunc110)TMath::Max));
491 AddFormula(
new TFormulaPrimitive(
"log",
"log",TMath::Log));
492 AddFormula(
new TFormulaPrimitive(
"exp",
"exp",TMath::Exp));
493 AddFormula(
new TFormulaPrimitive(
"log10",
"log10",TMath::Log10));
499 AddFormula(
new TFormulaPrimitive(
"TMath::CosH",
"TMath::Cosh",cosh));
500 AddFormula(
new TFormulaPrimitive(
"cosh",
"cosh",cosh));
501 AddFormula(
new TFormulaPrimitive(
"TMath::SinH",
"TMath::SinH",sinh));
502 AddFormula(
new TFormulaPrimitive(
"sinh",
"sinh",sinh));
503 AddFormula(
new TFormulaPrimitive(
"TMath::TanH",
"TMath::Tanh",tanh));
504 AddFormula(
new TFormulaPrimitive(
"tanh",
"tanh",tanh));
505 AddFormula(
new TFormulaPrimitive(
"TMath::ACosH",
"TMath::ACosh",TMath::ACosH));
506 AddFormula(
new TFormulaPrimitive(
"acosh",
"acosH",TMath::ACosH));
507 AddFormula(
new TFormulaPrimitive(
"TMath::ASinH",
"TMath::ASinh",TMath::ASinH));
508 AddFormula(
new TFormulaPrimitive(
"acosh",
"acosH",TMath::ASinH));
509 AddFormula(
new TFormulaPrimitive(
"TMath::ATanH",
"TMath::ATanh",TMath::ATanH));
510 AddFormula(
new TFormulaPrimitive(
"atanh",
"atanh",TMath::ATanH));
512 AddFormula(
new TFormulaPrimitive(
"TMath::Abs",
"TMath::Abs",TMath::Abs));
513 AddFormula(
new TFormulaPrimitive(
"TMath::BreitWigner",
"TMath::BreitWigner",TMath::BreitWigner));
518 TMath_GenerInterface();