ROOT logo
#ifndef AliAODRedCov_H
#define AliAODRedCov_H
/* Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id$ */

//-------------------------------------------------------------------------
//     Reduced Cov Matrix
//     Author: fca
//-------------------------------------------------------------------------

#include <Rtypes.h>
#include <TMath.h>

template <Int_t N> class AliAODRedCov {


   //
   //  Class containing reduced cov matrix, see example here for a track
   //
   //       X          Y          Z         Px        Py        Pz
   //
   // X  fDiag[ 0]  
   //
   // Y  fOdia[ 0]  fDiag[ 1]
   //
   // Z  fOdia[ 1]  fOdia[ 2]  fDiag[ 2]
   //
   // Px fOdia[ 3]  fOdia[ 4]  fOdia[ 5]  fDiag[ 3]
   //
   // Py fOdia[ 6]  fOdia[ 7]  fOdia[ 8]  fOdia[ 9]  fDiag[ 4]
   //
   // Pz fOdia[10]  fOdia[11]  fOdia[12]  fOdia[13]  fOdia[14]  fDiag[ 5]
   //

 public:
  AliAODRedCov() {
    for(Int_t i=0; i<N; i++)         fDiag[i]       = 0.;
    for(Int_t i=0; i<N*(N-1)/2; i++) fODia[i]       = 0.;
  }
  virtual ~AliAODRedCov() {}
  template <class T> void GetCovMatrix(T *cmat) const;
  template <class T> void SetCovMatrix(T *cmat);
  
 private:
  Double32_t   fDiag[N];         // Diagonal elements
  Double32_t   fODia[N*(N-1)/2]; // [-1, 1,8] 8 bit precision for off diagonal elements
  
  ClassDef(AliAODRedCov,1)

 };

//Cint craps out here, we protect this part
#if !defined(__CINT__) && !defined(__MAKECINT__)

//#define DEBUG

//______________________________________________________________________________
template <Int_t N> template <class T> inline void AliAODRedCov<N>::GetCovMatrix(T *cmat) const
{
  //
  // Returns the external cov matrix
  //

  for(Int_t i=0; i<N; ++i) {
    // Off diagonal elements
    for(Int_t j=0; j<i; ++j) {
      cmat[i*(i+1)/2+j] = (fDiag[j] >= 0. && fDiag[i] >= 0.) ? fODia[(i-1)*i/2+j]*fDiag[j]*fDiag[i]: -999.;
#ifdef DEBUG
      printf("cmat[%2d] = fODia[%2d]*fDiag[%2d]*fDiag[%2d] = %f\n",
	     i*(i+1)/2+j,(i-1)*i/2+j,j,i,cmat[i*(i+1)/2+j]);
#endif
    }

    // Diagonal elements
    cmat[i*(i+1)/2+i] = (fDiag[i] >= 0.) ? fDiag[i]*fDiag[i] : -999.;
#ifdef DEBUG
    printf("cmat[%2d] = fDiag[%2d]*fDiag[%2d] = %f\n",
	   i*(i+1)/2+i,i,i,cmat[i*(i+1)/2+i]);
#endif
  }
}


//______________________________________________________________________________
template <Int_t N> template <class T> inline void AliAODRedCov<N>::SetCovMatrix(T *cmat)
{
  //
  // Sets the external cov matrix
  //

  if(cmat) {
    
#ifdef DEBUG
    for (Int_t i=0; i<(N*(N+1))/2; i++) {
      printf("cmat[%d] = %f\n", i, cmat[i]);
    }
#endif
    
    // Diagonal elements first
    for(Int_t i=0; i<N; ++i) {
      fDiag[i] = (cmat[i*(i+1)/2+i] >= 0.) ? TMath::Sqrt(cmat[i*(i+1)/2+i]) : -999.;
#ifdef DEBUG
	printf("fDiag[%2d] = TMath::Sqrt(cmat[%2d]) = %f\n",
	       i,i*(i+1)/2+i, fDiag[i]);
#endif
  }
  
  // ... then the ones off diagonal
  for(Int_t i=0; i<N; ++i) 
    // Off diagonal elements
    for(Int_t j=0; j<i; ++j) {
      fODia[(i-1)*i/2+j] = (fDiag[i] > 0. && fDiag[j] > 0.) ? cmat[i*(i+1)/2+j]/(fDiag[j]*fDiag[i]) : 0.;
      // check for division by zero (due to diagonal element of 0) and for fDiag != -999. (due to negative input diagonal element).
      if (fODia[(i-1)*i/2+j]>1.) { // check upper boundary
#ifdef DEBUG
	printf("out of bounds: %f\n", fODia[(i-1)*i/2+j]);
#endif
	fODia[(i-1)*i/2+j] = 1.;
      }
      if (fODia[(i-1)*i/2+j]<-1.) { // check lower boundary
#ifdef DEBUG
	printf("out of bounds: %f\n", fODia[(i-1)*i/2+j]);
#endif
	fODia[(i-1)*i/2+j] = -1.; 
      }
#ifdef DEBUG
	printf("fODia[%2d] = cmat[%2d]/(fDiag[%2d]*fDiag[%2d]) = %f\n",
	       (i-1)*i/2+j,i*(i+1)/2+j,j,i,fODia[(i-1)*i/2+j]); 
#endif
    }
  } else {
    for(Int_t i=0; i< N; ++i) fDiag[i]=-999.;
    for(Int_t i=0; i< N*(N-1)/2; ++i) fODia[i]=0.;
  }

  return;
}

#undef DEBUG

#endif
#endif
 AliAODRedCov.h:1
 AliAODRedCov.h:2
 AliAODRedCov.h:3
 AliAODRedCov.h:4
 AliAODRedCov.h:5
 AliAODRedCov.h:6
 AliAODRedCov.h:7
 AliAODRedCov.h:8
 AliAODRedCov.h:9
 AliAODRedCov.h:10
 AliAODRedCov.h:11
 AliAODRedCov.h:12
 AliAODRedCov.h:13
 AliAODRedCov.h:14
 AliAODRedCov.h:15
 AliAODRedCov.h:16
 AliAODRedCov.h:17
 AliAODRedCov.h:18
 AliAODRedCov.h:19
 AliAODRedCov.h:20
 AliAODRedCov.h:21
 AliAODRedCov.h:22
 AliAODRedCov.h:23
 AliAODRedCov.h:24
 AliAODRedCov.h:25
 AliAODRedCov.h:26
 AliAODRedCov.h:27
 AliAODRedCov.h:28
 AliAODRedCov.h:29
 AliAODRedCov.h:30
 AliAODRedCov.h:31
 AliAODRedCov.h:32
 AliAODRedCov.h:33
 AliAODRedCov.h:34
 AliAODRedCov.h:35
 AliAODRedCov.h:36
 AliAODRedCov.h:37
 AliAODRedCov.h:38
 AliAODRedCov.h:39
 AliAODRedCov.h:40
 AliAODRedCov.h:41
 AliAODRedCov.h:42
 AliAODRedCov.h:43
 AliAODRedCov.h:44
 AliAODRedCov.h:45
 AliAODRedCov.h:46
 AliAODRedCov.h:47
 AliAODRedCov.h:48
 AliAODRedCov.h:49
 AliAODRedCov.h:50
 AliAODRedCov.h:51
 AliAODRedCov.h:52
 AliAODRedCov.h:53
 AliAODRedCov.h:54
 AliAODRedCov.h:55
 AliAODRedCov.h:56
 AliAODRedCov.h:57
 AliAODRedCov.h:58
 AliAODRedCov.h:59
 AliAODRedCov.h:60
 AliAODRedCov.h:61
 AliAODRedCov.h:62
 AliAODRedCov.h:63
 AliAODRedCov.h:64
 AliAODRedCov.h:65
 AliAODRedCov.h:66
 AliAODRedCov.h:67
 AliAODRedCov.h:68
 AliAODRedCov.h:69
 AliAODRedCov.h:70
 AliAODRedCov.h:71
 AliAODRedCov.h:72
 AliAODRedCov.h:73
 AliAODRedCov.h:74
 AliAODRedCov.h:75
 AliAODRedCov.h:76
 AliAODRedCov.h:77
 AliAODRedCov.h:78
 AliAODRedCov.h:79
 AliAODRedCov.h:80
 AliAODRedCov.h:81
 AliAODRedCov.h:82
 AliAODRedCov.h:83
 AliAODRedCov.h:84
 AliAODRedCov.h:85
 AliAODRedCov.h:86
 AliAODRedCov.h:87
 AliAODRedCov.h:88
 AliAODRedCov.h:89
 AliAODRedCov.h:90
 AliAODRedCov.h:91
 AliAODRedCov.h:92
 AliAODRedCov.h:93
 AliAODRedCov.h:94
 AliAODRedCov.h:95
 AliAODRedCov.h:96
 AliAODRedCov.h:97
 AliAODRedCov.h:98
 AliAODRedCov.h:99
 AliAODRedCov.h:100
 AliAODRedCov.h:101
 AliAODRedCov.h:102
 AliAODRedCov.h:103
 AliAODRedCov.h:104
 AliAODRedCov.h:105
 AliAODRedCov.h:106
 AliAODRedCov.h:107
 AliAODRedCov.h:108
 AliAODRedCov.h:109
 AliAODRedCov.h:110
 AliAODRedCov.h:111
 AliAODRedCov.h:112
 AliAODRedCov.h:113
 AliAODRedCov.h:114
 AliAODRedCov.h:115
 AliAODRedCov.h:116
 AliAODRedCov.h:117
 AliAODRedCov.h:118
 AliAODRedCov.h:119
 AliAODRedCov.h:120
 AliAODRedCov.h:121
 AliAODRedCov.h:122
 AliAODRedCov.h:123
 AliAODRedCov.h:124
 AliAODRedCov.h:125
 AliAODRedCov.h:126
 AliAODRedCov.h:127
 AliAODRedCov.h:128
 AliAODRedCov.h:129
 AliAODRedCov.h:130
 AliAODRedCov.h:131
 AliAODRedCov.h:132
 AliAODRedCov.h:133
 AliAODRedCov.h:134
 AliAODRedCov.h:135
 AliAODRedCov.h:136
 AliAODRedCov.h:137
 AliAODRedCov.h:138
 AliAODRedCov.h:139
 AliAODRedCov.h:140
 AliAODRedCov.h:141
 AliAODRedCov.h:142
 AliAODRedCov.h:143
 AliAODRedCov.h:144