00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "MdcRecoUtil/DifArray.h"
00023 #include "MdcRecoUtil/DifNumber.h"
00024 #include <iostream>
00025 using std::endl;
00026
00027 using std::cout;
00028
00029 DifArray::DifArray(int n,int npar):
00030 _nElem(n),
00031 _pointer(new DifNumber[n])
00032 {zero(npar);}
00033
00034 DifArray::DifArray(const HepVector & a,int npar):
00035 _nElem(a.num_row()),
00036 _pointer(new DifNumber[nElem()])
00037 {copy(a,npar);}
00038
00039
00040 DifArray::DifArray(const DifArray& a):
00041 _nElem(a.nElem()),
00042 _pointer(new DifNumber[nElem()])
00043 {copy(a);}
00044
00045 DifArray::~DifArray() {delete[] _pointer;}
00046
00047 DifNumber& DifArray::operator[](int i){
00048 assert(i>=0);
00049 assert(i<nElem());
00050 return _pointer[i];
00051 }
00052
00053 DifNumber& DifArray::operator()(int i){
00054 i=i-1;
00055 assert(i>=0);
00056 assert(i<nElem());
00057 return _pointer[i];
00058 }
00059
00060 DifNumber DifArray::fetch(int i)const{
00061 i=i-1;
00062 assert(i>=0);
00063 assert(i<nElem());
00064 return _pointer[i];
00065 }
00066
00067 DifArray& DifArray::operator=(const DifArray& rhs){
00068 copy(rhs);
00069 return *this;
00070 }
00071
00072 HepMatrix DifArray::jacobian()const {
00073 int npar=_pointer[0].nPar();
00074 HepMatrix temp(nElem(),npar,0);
00075 for(int i=1; i<=nElem(); i++){
00076 for(int j=1; j<=npar; j++) {
00077 temp(i,j)=_pointer[i-1].derivative(j);
00078 }
00079 }
00080 return temp;
00081 }
00082
00083 void DifArray::copy(const HepVector& a,int npar){
00084 assert(nElem()==a.num_row());
00085 for(int i=0; i<nElem(); i++)
00086 {
00087 _pointer[i].setNumber(a(i+1));
00088 _pointer[i].setNPar(npar);
00089 }
00090 }
00091
00092 void DifArray::copy(const DifArray& a){
00093 assert(nElem()==a.nElem());
00094 for(int i=0; i<nElem(); i++) {_pointer[i]=a._pointer[i];}
00095 }
00096
00097 void DifArray::zero(int npar){
00098 for(int i=0; i<nElem(); i++) {
00099 _pointer[i]=0.0;
00100 _pointer[i].setNPar(npar);
00101 }
00102 }
00103
00104 void DifArray::print()const{
00105 cout << "nElem=" << nElem() << endl;
00106 for(int i=1; i<=nElem(); i++){
00107
00108 }
00109
00110 }