00001 #include <stdarg.h>
00002 #include <iomanip>
00003 #include "TRArray.h"
00004 #include "TString.h"
00005 #if ROOT_VERSION_CODE < 331013
00006 #include "TCL.h"
00007 #else
00008 #include "TCernLib.h"
00009 #endif
00010 #include "TObjString.h"
00011 #include "TObjArray.h"
00012 ClassImp(TRArray);
00013
00014 TRArray::TRArray(Int_t N,const Float_t *Array): TArrayD(N), fValid(kTRUE), fIsNotOwn(kFALSE) {
00015 TCL::ucopy(Array,fArray,N);
00016 }
00017
00018 TRArray::TRArray(Int_t N,Double_t va_(a0), ...) : TArrayD(N), fValid(kTRUE), fIsNotOwn(kFALSE) {
00019 __VA_LIST__(a0);
00020 }
00021
00022 TRArray::TRArray(Int_t N,const Char_t *s): TArrayD(N), fValid(kTRUE), fIsNotOwn(kFALSE) {
00023 static TString separator = "([^\t ;,]+)";
00024 TString opt(s);
00025 TObjArray *array = opt.Tokenize(separator);
00026 TIter next(array);
00027 TObjString *objs;
00028 Int_t i = 0;
00029 while ((objs = (TObjString *) next()) && i < N) {fArray[i++] = objs->GetString().Atof();}
00030 delete array;
00031 }
00032
00033 Double_t TRArray::Mag2() const {
00034 return TCL::vdot(fArray,fArray,fN);
00035 }
00036
00037 ostream& operator<<(ostream& s,const TRArray &target) {
00038 s << "Size \t" << target.fN << endl;
00039 if (target.fArray)
00040 for (int i = 0; i< target.fN; i++) {
00041 s << Form("%10.3f", target.fArray[i]);
00042 if ((i+1)%10 == 0) s << endl;
00043 }
00044 else s << " Empty";
00045 s << endl;
00046 return s;
00047 }
00048
00049 istream & operator>>(istream &s, TRArray &target) {
00050 Int_t N;
00051 s >> N;
00052 if (N != target.fN) target.Set(N);
00053 for (int i = 0; i < N; i++) s >> target.fArray[i];
00054 return s;
00055 }
00056
00057 TRArray &TRArray::operator=(const TRArray &rhs) {
00058 if (this != &rhs) {
00059 if (! fIsNotOwn) Set(rhs.fN, rhs.fArray);
00060 else {
00061 fN = rhs.fN;
00062 memcpy(fArray,rhs.fArray, fN*sizeof(Double_t));
00063 }
00064 }
00065 return *this;
00066 }
00067
00068 Bool_t TRArray::Verify(const TRArray &A, Double_t zeru, Int_t Level) const {
00069
00070 Int_t fails = 0;
00071 if (fN != A.GetSize()) {
00072 if (Level) cout << "Check length is inconsistent:" << fN << " != " << A.GetSize() << endl;
00073 return kTRUE;
00074 }
00075 const Double_t *aArray = A.GetArray();
00076 for (int i=0; i<fN; i++) {
00077 Double_t diff = TMath::Abs(aArray[i] - fArray[i]);
00078 Double_t sum = TMath::Abs(aArray[i] + fArray[i]);
00079 if (diff > zeru || (sum > 2. && (2 * diff ) / sum > zeru)) {
00080 fails++;
00081 if (Level)
00082 cout << "Failed:[" << i << "]\t" << aArray[i] << "\t" << fArray[i] << "\tdiff\t" << diff << endl;
00083 continue;
00084 }
00085 else if (Level > 1)
00086 cout << "Passed:[" << i << "]\t" << aArray[i] << "\t" << fArray[i] << "\tdiff\t" << diff << endl;
00087 }
00088 if (fails) {
00089 cout << "Failed " << fails << " times" << endl;
00090 }
00091 return fails != 0;
00092 }
00093
00094 void TRArray::Print(Option_t *opt) const {if (opt) {}; cout << *this << endl;}
00095
00096 void TRArray::AdoptA(Int_t n, Double_t *arr) {
00097
00098
00099 fN = n;
00100 if (fArray == arr) return;
00101 if (fArray && arr != arr && ! fIsNotOwn) delete [] fArray;
00102 fIsNotOwn = kTRUE;
00103 fArray = arr;
00104 }
00105
00106 void TRArray::Set(Int_t n) {
00107
00108
00109
00110
00111
00112 if (n < 0) return;
00113 if (fIsNotOwn) {
00114 memset(&fArray[fN],0,(n-fN)*sizeof(Double_t));
00115 fN = n;
00116 return;
00117 }
00118 if (n != fN) {
00119 Double_t *temp = fArray;
00120 if (n != 0) {
00121 fArray = new Double_t[n];
00122 if (n < fN) memcpy(fArray,temp, n*sizeof(Double_t));
00123 else {
00124 memcpy(fArray,temp,fN*sizeof(Double_t));
00125 memset(&fArray[fN],0,(n-fN)*sizeof(Double_t));
00126 }
00127 } else {
00128 fArray = 0;
00129 }
00130 if (fN) delete [] temp;
00131 fN = n;
00132 }
00133 }
00134
00135 void TRArray::Set(Int_t n, const Float_t *array) {
00136
00137
00138 if (fArray && fN != n && ! fIsNotOwn) {
00139 delete [] fArray;
00140 fArray = 0;
00141 }
00142 fN = n;
00143 if (fN == 0) return;
00144 if (array == 0) return;
00145 if (!fArray) {
00146 fIsNotOwn = kFALSE;
00147 fArray = new Double_t[fN];
00148 }
00149 TCL::ucopy(array,fArray,n);
00150 }
00151
00152 void TRArray::Set(Int_t n, const Double_t *array) {
00153
00154
00155 if (fArray && fN != n && ! fIsNotOwn) {
00156 delete [] fArray;
00157 fArray = 0;
00158 }
00159 fN = n;
00160 if (fN == 0) return;
00161 if (array == 0) return;
00162 if (!fArray) {
00163 fIsNotOwn = kFALSE;
00164 fArray = new Double_t[fN];
00165 }
00166 memcpy(fArray,array, n*sizeof(Double_t));
00167 }