ROOT logo
//*-- Author : R.Schicker
//*-- Modified : M.Sanchez (01.06.2000)

#include "hsymmat.h"
#include <math.h>

//_HADES_CLASS_DESCRIPTION 
/////////////////////////////////////////
// HSymMat 
//
//  Implements a generic symetric matrix
//  In order to allow statically sized matrixes
//the HSymMat class cannot be instantiated directly
//but one of the derived classes HSymMat4, HSymMat5 ...
//can be instantiated.
//
//  Each of these classes corresponds to a 
//symetric matrix of fixed dimension; i.e. HSymMat5 is
//a symetric matrix of dimension 5.
//
//  The HSymMatX classes themselves have no useful
//methods, but inherit all their functionality from
//HSymMat.
//
//  Elements in the matrix can be accessed both via
//a row and column number or with a linear index. The
//relation between both of them is:
//linear_index = row * dimension + column
/////////////////////////////////////////////

HSymMat::HSymMat(void) {
  //Constructor. 
  size = 0;
  pData = 0;
}

HSymMat::HSymMat(Int_t idim) {
  //Constructor with specific dimension.
  size = (idim * (idim + 1) / 2);
  pData = 0;
  dim = idim;
}

HSymMat::~HSymMat(void) { 
}

Float_t HSymMat::convolution(Float_t v1[], Float_t v2[]) {
  Float_t r=0.;
  
  for (Int_t i=0;i<dim;i++) {
    for (Int_t j=0;j<dim;j++) {
      r += v1[i]*getElement(i,j)*v2[j];
    }
  }

  return r;
}

void HSymMat::transform(const HSymMat &m, Float_t der[]) {
  Int_t cols = m.getDim();
  Float_t sum;

  for (Int_t i=0;i<dim;i++) {
    for (Int_t j=i; j<dim; j++) {
      sum = 0.;
      for (Int_t k=0;k<cols;k++) {
	for (Int_t l=0;l<cols;l++) {
	  sum += m.getElement(k,l)*der[i*cols + k]*der[j*cols + l];
	}
      }
      setElement(i,j,sum);
    }
  }
}


void HSymMat::Clear(void){
  //Clears the matrix
  for (Int_t i=0;i<size;i++) pData[i]=0.F;
}

void HSymMat::setElement(const Int_t i,const Float_t elel){
  //Sets the element with linear index i to the value elel.
  if (i<size)
    pData[i]=elel;
  else
    Error("setElement","Index %i out of bounds",i);
}

void HSymMat::setElement(const Int_t i,const Int_t j,Float_t elel) {
  //Sets element at row i and column j to the value elel
  if (i >= dim || j >= dim) {
    Error("setElement","Out of bounds! ");
  } else {
    pData[getLinear(i,j)]=elel;
  } 
}

void HSymMat::setErr(const Int_t i,const Float_t elel){
  //Sets element (i,i) to the value elel
  if (i >= dim) {
    Error("setErr","Out of bounds! ");
  } else {
    pData[getLinear(i,i)]=elel*elel;
  } 
}

void HSymMat::setCov(HSymMat& a){
  //Copies the matrix a
  if( dim != a.dim){
    Error("setCov","Dimensions don't match! "); 
  } else {
    for(Int_t ind=0; ind<size; ind++) {
      pData[ind]=a.pData[ind];
    }
  }
}

Float_t HSymMat::getElement(const Int_t i)  const {
  //Return the element given by the linear index i
  if (i<size) 
    return pData[i];
  else
    Error("getElement","Index %i out of bounds",i);
  return 0.F;
}

Float_t HSymMat::getElement(const Int_t i,const Int_t j) const {
  //Returns the element at (i,j)
  Int_t ind;

  if (i >= dim || j >= dim) {
    Error("getElement","Out of bounds! ");
  } else {
    ind=getLinear(i,j);
    return pData[ind];
  } 
  return 0;
}

Float_t HSymMat::getErr(const Int_t i){
  //Returns the element at (i,i)

  if (i >= dim) {
    Error("getErr","Out of bounds! ");
  } else {
    return sqrt(pData[getLinear(i,i)]);
  }
  return 0;
}

void HSymMat::getCov(HSymMat& a){
  //Copies this matrix into a
  if( dim != a.dim) {
    Error("getCov","Dimensions don't match! "); 
  } else {
    for(Int_t ind=0; ind<size; ind++){
      a.pData[ind]=pData[ind];
    }
  }
}
 
void HSymMat::print(void){
  //Prints out the matrix elements
  printf("Covariance matrix dimension: %i \n",dim);
  for(Int_t ir=0; ir<dim; ir++) {
    for(Int_t ic=0; ic<dim; ic++) {
      printf("%11.4g ",getElement(ir,ic));
    }
    printf(" \n");
  }
}

ClassImp(HSymMat) // HSymMat 
ClassImp(HSymMat2)
ClassImp(HSymMat3)
ClassImp(HSymMat4)
ClassImp(HSymMat5)
ClassImp(HSymMat6)










 hsymmat.cc:1
 hsymmat.cc:2
 hsymmat.cc:3
 hsymmat.cc:4
 hsymmat.cc:5
 hsymmat.cc:6
 hsymmat.cc:7
 hsymmat.cc:8
 hsymmat.cc:9
 hsymmat.cc:10
 hsymmat.cc:11
 hsymmat.cc:12
 hsymmat.cc:13
 hsymmat.cc:14
 hsymmat.cc:15
 hsymmat.cc:16
 hsymmat.cc:17
 hsymmat.cc:18
 hsymmat.cc:19
 hsymmat.cc:20
 hsymmat.cc:21
 hsymmat.cc:22
 hsymmat.cc:23
 hsymmat.cc:24
 hsymmat.cc:25
 hsymmat.cc:26
 hsymmat.cc:27
 hsymmat.cc:28
 hsymmat.cc:29
 hsymmat.cc:30
 hsymmat.cc:31
 hsymmat.cc:32
 hsymmat.cc:33
 hsymmat.cc:34
 hsymmat.cc:35
 hsymmat.cc:36
 hsymmat.cc:37
 hsymmat.cc:38
 hsymmat.cc:39
 hsymmat.cc:40
 hsymmat.cc:41
 hsymmat.cc:42
 hsymmat.cc:43
 hsymmat.cc:44
 hsymmat.cc:45
 hsymmat.cc:46
 hsymmat.cc:47
 hsymmat.cc:48
 hsymmat.cc:49
 hsymmat.cc:50
 hsymmat.cc:51
 hsymmat.cc:52
 hsymmat.cc:53
 hsymmat.cc:54
 hsymmat.cc:55
 hsymmat.cc:56
 hsymmat.cc:57
 hsymmat.cc:58
 hsymmat.cc:59
 hsymmat.cc:60
 hsymmat.cc:61
 hsymmat.cc:62
 hsymmat.cc:63
 hsymmat.cc:64
 hsymmat.cc:65
 hsymmat.cc:66
 hsymmat.cc:67
 hsymmat.cc:68
 hsymmat.cc:69
 hsymmat.cc:70
 hsymmat.cc:71
 hsymmat.cc:72
 hsymmat.cc:73
 hsymmat.cc:74
 hsymmat.cc:75
 hsymmat.cc:76
 hsymmat.cc:77
 hsymmat.cc:78
 hsymmat.cc:79
 hsymmat.cc:80
 hsymmat.cc:81
 hsymmat.cc:82
 hsymmat.cc:83
 hsymmat.cc:84
 hsymmat.cc:85
 hsymmat.cc:86
 hsymmat.cc:87
 hsymmat.cc:88
 hsymmat.cc:89
 hsymmat.cc:90
 hsymmat.cc:91
 hsymmat.cc:92
 hsymmat.cc:93
 hsymmat.cc:94
 hsymmat.cc:95
 hsymmat.cc:96
 hsymmat.cc:97
 hsymmat.cc:98
 hsymmat.cc:99
 hsymmat.cc:100
 hsymmat.cc:101
 hsymmat.cc:102
 hsymmat.cc:103
 hsymmat.cc:104
 hsymmat.cc:105
 hsymmat.cc:106
 hsymmat.cc:107
 hsymmat.cc:108
 hsymmat.cc:109
 hsymmat.cc:110
 hsymmat.cc:111
 hsymmat.cc:112
 hsymmat.cc:113
 hsymmat.cc:114
 hsymmat.cc:115
 hsymmat.cc:116
 hsymmat.cc:117
 hsymmat.cc:118
 hsymmat.cc:119
 hsymmat.cc:120
 hsymmat.cc:121
 hsymmat.cc:122
 hsymmat.cc:123
 hsymmat.cc:124
 hsymmat.cc:125
 hsymmat.cc:126
 hsymmat.cc:127
 hsymmat.cc:128
 hsymmat.cc:129
 hsymmat.cc:130
 hsymmat.cc:131
 hsymmat.cc:132
 hsymmat.cc:133
 hsymmat.cc:134
 hsymmat.cc:135
 hsymmat.cc:136
 hsymmat.cc:137
 hsymmat.cc:138
 hsymmat.cc:139
 hsymmat.cc:140
 hsymmat.cc:141
 hsymmat.cc:142
 hsymmat.cc:143
 hsymmat.cc:144
 hsymmat.cc:145
 hsymmat.cc:146
 hsymmat.cc:147
 hsymmat.cc:148
 hsymmat.cc:149
 hsymmat.cc:150
 hsymmat.cc:151
 hsymmat.cc:152
 hsymmat.cc:153
 hsymmat.cc:154
 hsymmat.cc:155
 hsymmat.cc:156
 hsymmat.cc:157
 hsymmat.cc:158
 hsymmat.cc:159
 hsymmat.cc:160
 hsymmat.cc:161
 hsymmat.cc:162
 hsymmat.cc:163
 hsymmat.cc:164
 hsymmat.cc:165
 hsymmat.cc:166
 hsymmat.cc:167
 hsymmat.cc:168
 hsymmat.cc:169
 hsymmat.cc:170
 hsymmat.cc:171
 hsymmat.cc:172
 hsymmat.cc:173
 hsymmat.cc:174
 hsymmat.cc:175
 hsymmat.cc:176
 hsymmat.cc:177
 hsymmat.cc:178
 hsymmat.cc:179
 hsymmat.cc:180
 hsymmat.cc:181
 hsymmat.cc:182
 hsymmat.cc:183
 hsymmat.cc:184
 hsymmat.cc:185
 hsymmat.cc:186
 hsymmat.cc:187
 hsymmat.cc:188
 hsymmat.cc:189