#include "hsymmat.h"
#include <math.h>
HSymMat::HSymMat(void) {
  
  size = 0;
  pData = 0;
}
HSymMat::HSymMat(Int_t idim) {
  
  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){
  
  for (Int_t i=0;i<size;i++) pData[i]=0.F;
}
void HSymMat::setElement(const Int_t i,const Float_t 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) {
  
  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){
  
  if (i >= dim) {
    Error("setErr","Out of bounds! ");
  } else {
    pData[getLinear(i,i)]=elel*elel;
  } 
}
void HSymMat::setCov(HSymMat& 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 {
  
  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 {
  
  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){
  
  if (i >= dim) {
    Error("getErr","Out of bounds! ");
  } else {
    return sqrt(pData[getLinear(i,i)]);
  }
  return 0;
}
void HSymMat::getCov(HSymMat& 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){
  
  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) 
ClassImp(HSymMat2)
ClassImp(HSymMat3)
ClassImp(HSymMat4)
ClassImp(HSymMat5)
ClassImp(HSymMat6)
Last change: Sat May 22 13:15:03 2010
Last generated: 2010-05-22 13:15
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.