00001 #ifndef ROOT_TRArray
00002 #define ROOT_TRArray
00003 #include <assert.h>
00004 #include "Riostream.h"
00005 #include "Rstrstream.h"
00006 #include "Rtypes.h"
00007 #include "TObject.h"
00008 #include "TArrayD.h"
00009 #include "TMath.h"
00010 #include "Varargs.h"
00011 #if ROOT_VERSION_CODE < 331013
00012 #include "TCL.h"
00013 #else
00014 #include "TCernLib.h"
00015 #endif
00016 #ifndef __CINT__
00017 #define __VA_LIST__(name) \
00018 va_list args; \
00019 va_start(args,va_(name)); \
00020 for (Int_t num=0; num<fN; num++) { \
00021 if (! num) fArray[0] = name; \
00022 else fArray[num] = (Double_t) va_arg(args, Double_t); \
00023 } \
00024 va_end(args);
00025 #endif
00026
00027
00028
00029 class TRArray : public TArrayD {
00030 public:
00031 enum ETRMatrixType {kUndefined, kVector, kRectangular, kSemiPosDefinedSymMatrix, kDiagonalMatrix};
00032 enum ETRMatrixCreatorsOp { kZero, kUnit, kTransposed, kInverted, kInvertedPosDef, kInvertedA,
00033 kMult,
00034 kAxB, kAxBT, kATxB, kATxBT,
00035 kAxBxAT, kATxBxA,
00036 kSxA, kAxS, kSxAT, kATxS,
00037 kAxAT, kATxA,
00038 kAxSxAT, kATxSxA, kRxSxR
00039 };
00040 TRArray(Int_t N=0): TArrayD(N), fValid(kTRUE), fIsNotOwn(kFALSE) {}
00041
00042 #ifndef __CINT__
00043 TRArray(Int_t N,Double_t a0, ...);
00044 #endif
00045 TRArray(Int_t N,const Double_t *Array): TArrayD(N,Array), fValid(kTRUE), fIsNotOwn(kFALSE) {}
00046 TRArray(Int_t N,const Float_t *Array);
00047 TRArray(const TRArray &A,const Double_t fA, TRArray &B,const Double_t fB): TArrayD(0), fValid(kTRUE), fIsNotOwn(kFALSE) {
00048 Int_t N = A.GetSize(); assert (N == B.GetSize()); Set(N);
00049 TCL::vlinco(A.GetArray(),fA,B.GetArray(),fB,fArray,N);
00050 }
00051 TRArray(Int_t N,const Char_t *s);
00052 virtual ~TRArray() {if (fIsNotOwn) fArray = 0;}
00053 virtual Int_t GetNrows() const {return GetSize();}
00054 virtual Int_t GetNcols() const {return 1;}
00055 virtual ETRMatrixType GetMatrixType() const {return kUndefined;}
00056 virtual Bool_t IsValid() const {return fValid;}
00057 virtual Double_t Mag2() const;
00058 virtual Double_t Mag() const {return TMath::Sqrt(Mag2());}
00059 virtual void SetValid(Bool_t Valid=kTRUE) {fValid = Valid;}
00060 void Set(Int_t n);
00061 void Set(Int_t n, const Double_t *array);
00062 void Set(Int_t n, const Float_t *array);
00063 void AdoptA(Int_t n, Double_t *arr);
00064 void reset() {Reset();}
00065 TRArray& operator=(const TRArray &rhs);
00066 virtual Double_t &operator()(Int_t i) {return operator[](i);}
00067 virtual Double_t operator()(Int_t i) const {return operator[](i);}
00068 friend TRArray &operator-=(TRArray &target, Double_t scalar) {
00069 for (int i=0; i<target.fN; i++) target.fArray[i] -= scalar; return target;}
00070 friend TRArray &operator+=(TRArray &target, Double_t scalar) {
00071 for (int i=0; i<target.fN; i++) target.fArray[i] += scalar; return target;
00072 }
00073 friend Double_t operator*(const TRArray &target, const TRArray &source) {
00074 assert(target.fN == source.GetSize());
00075 Double_t sum = 0;
00076 const Double_t *sArray = source.GetArray();
00077 for (int i=0; i<target.fN; i++) sum += target.fArray[i]*sArray[i]; return sum;
00078 }
00079 friend TRArray &operator*=(TRArray &target, Double_t scalar) {
00080 for (int i=0; i<target.fN; i++) target.fArray[i] *= scalar; return target;
00081 }
00082 friend TRArray &operator/=(TRArray &target, Double_t scalar) {
00083 for (int i=0; i<target.fN; i++) target.fArray[i] /= scalar; return target;
00084 }
00085 friend TRArray &operator-=(TRArray &target, const TRArray &A) {
00086 assert(target.fN == A.GetSize());
00087 const Double_t *fA = A.GetArray();
00088 for (int i=0; i<target.fN; i++) target.fArray[i] -= fA[i];
00089 return target;
00090 }
00091 friend TRArray &operator+=(TRArray &target, const TRArray &A) {
00092 assert(target.fN == A.GetSize());
00093 const Double_t *fA = A.GetArray();
00094 for (int i=0; i<target.fN; i++) target.fArray[i] += fA[i];
00095 return target;
00096 }
00097
00098 friend Bool_t operator==(TRArray &target, Double_t scalar) {
00099 for (int i=0; i<target.fN; i++) if (target.fArray[i] != scalar) return kFALSE;
00100 return kTRUE;
00101 }
00102 friend Bool_t operator==(TRArray &target, const TRArray &A) {
00103 if (target.fN != A.GetSize()) return kFALSE;
00104 const Double_t *fB = A.GetArray();
00105 for (int i=0; i<target.fN; i++) if (target.fArray[i] != fB[i]) return kFALSE; return kTRUE;
00106 }
00107 friend TRArray operator + (const TRArray &A, const TRArray &B) {TRArray C(A); C += B; return C;}
00108 friend TRArray operator - (const TRArray &A, const TRArray &B) {TRArray C(A); C -= B; return C;}
00109
00110 Bool_t Verify(const TRArray &A, const Double_t zeru=5.e-7, Int_t Level=1) const;
00111 virtual void Print(Option_t *opt="") const;
00112 protected:
00113 Bool_t fValid;
00114 Bool_t fIsNotOwn;
00115
00116
00117 public:
00118 ClassDef(TRArray,1)
00119 };
00120 ostream& operator<<(ostream& s,const TRArray &target);
00121 istream & operator>>(istream &s, TRArray &target);
00122
00123 #endif