00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef ROOT_Minuit2_LaSum
00011 #define ROOT_Minuit2_LaSum
00012
00013 #include "Minuit2/ABSum.h"
00014 #include "Minuit2/LAVector.h"
00015 #include "Minuit2/LASymMatrix.h"
00016
00017 namespace ROOT {
00018
00019 namespace Minuit2 {
00020
00021
00022 #define OP_ADD1(MT,MAT1,T) \
00023 inline ABObj<MT,MAT1,T> operator-(const ABObj<MT,MAT1,T>& m) {\
00024 return ABObj<MT,MAT1,T> (m.Obj(), T(-1.)*m.f());\
00025 }\
00026 \
00027 inline ABObj<MT,ABSum<ABObj<MT,MAT1,T>, ABObj<MT,MAT1,T> >,T> operator+(const ABObj<MT,MAT1,T>& a, const ABObj<MT,MAT1,T>& b) { \
00028 return ABObj<MT,ABSum<ABObj<MT,MAT1,T>, ABObj<MT,MAT1,T> >,T>(ABSum<ABObj<MT,MAT1,T>, ABObj<MT,MAT1,T> >(a, b)); \
00029 } \
00030 inline ABObj<MT,ABSum<ABObj<MT,MAT1,T>, ABObj<MT,MAT1,T> >,T> operator-(const ABObj<MT,MAT1,T>& a, const ABObj<MT,MAT1,T>& b) { \
00031 return ABObj<MT,ABSum<ABObj<MT,MAT1,T>, ABObj<MT,MAT1,T> >,T>(ABSum<ABObj<MT,MAT1,T>, ABObj<MT,MAT1,T> >(a,ABObj<MT,MAT1,T> (b.Obj(),T(-1.)*b.f()))); \
00032 }
00033
00034 OP_ADD1(vec,LAVector,double)
00035 OP_ADD1(sym,LASymMatrix,double)
00036
00037 #define OP_SCALE(MT,MAT1,T) \
00038 inline ABObj<MT,MAT1,T> operator*(T f, const MAT1& obj) { \
00039 return ABObj<MT,MAT1,T>(obj, f); \
00040 }
00041
00042 OP_SCALE(sym,LASymMatrix,double)
00043 OP_SCALE(vec,LAVector,double)
00044
00045 #define OP_SCALE1(MT,MAT1,T) \
00046 inline ABObj<MT,MAT1,T> operator/(const MAT1& obj, T f) { \
00047 return ABObj<MT,MAT1,T>(obj, 1./f); \
00048 }
00049
00050 OP_SCALE1(sym,LASymMatrix,double)
00051 OP_SCALE1(vec,LAVector,double)
00052
00053 #define OP_MIN(MT,MAT1,T) \
00054 inline ABObj<MT,MAT1,T> operator-(const MAT1& obj) { \
00055 return ABObj<MT,MAT1,T>(obj, T(-1.)); \
00056 }
00057
00058 OP_MIN(sym,LASymMatrix,double)
00059 OP_MIN(vec,LAVector,double)
00060
00061 }
00062
00063 }
00064
00065 #endif // ROOT_Minuit2_LaSum