]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliAODRedCov.h
Additional protections, corrected creation of kinks, neutral clusters included
[u/mrichter/AliRoot.git] / STEER / AliAODRedCov.h
CommitLineData
0e318744 1#ifndef AliAODRedCov_H
2#define AliAODRedCov_H
df9db588 3/* Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
4 * See cxx source for full Copyright notice */
5
6/* $Id$ */
7
8//-------------------------------------------------------------------------
9// Reduced Cov Matrix
10// Author: fca
11//-------------------------------------------------------------------------
12
13#include <Rtypes.h>
4d209fca 14#include <TMath.h>
df9db588 15
0e318744 16template <Int_t N> class AliAODRedCov {
df9db588 17
18
19 //
20 // Class containing reduced cov matrix, see example here for a track
21 //
22 // X Y Z Px Py Pz
23 //
24 // X fDiag[ 0]
25 //
26 // Y fOdia[ 0] fDiag[ 1]
27 //
28 // Z fOdia[ 1] fOdia[ 2] fDiag[ 2]
29 //
30 // Px fOdia[ 3] fOdia[ 4] fOdia[ 5] fDiag[ 3]
31 //
32 // Py fOdia[ 6] fOdia[ 7] fOdia[ 8] fOdia[ 9] fDiag[ 4]
33 //
34 // Pz fOdia[10] fOdia[11] fOdia[12] fOdia[13] fOdia[14] fDiag[ 5]
35 //
36
4d209fca 37 public:
38 AliAODRedCov() {}
39 virtual ~AliAODRedCov() {}
40 template <class T> void GetCovMatrix(T *cmat) const;
41 template <class T> void SetCovMatrix(T *cmat);
42
43 private:
44 Double32_t fDiag[N]; // Diagonal elements
45 Double32_t fODia[N*(N-1)/2]; // [-1, 1,8] 8 bit precision for off diagonal elements
46
47 ClassDef(AliAODRedCov,1)
df9db588 48
4d209fca 49 };
df9db588 50
c98a50a1 51//Cint craps out here, we protect this part
4d209fca 52#if !defined(__CINT__) && !defined(__MAKECINT__)
c98a50a1 53
b4116488 54//#define DEBUG
c98a50a1 55
4d209fca 56//______________________________________________________________________________
c98a50a1 57template <Int_t N> template <class T> inline void AliAODRedCov<N>::GetCovMatrix(T *cmat) const
4d209fca 58{
59 //
60 // Returns the external cov matrix
61 //
62
63 for(Int_t i=0; i<N; ++i) {
64 // Off diagonal elements
65 for(Int_t j=0; j<i; ++j) {
c98a50a1 66#ifdef DEBUG
4d209fca 67 printf("cmat[%2d] = fODia[%2d]*fDiag[%2d]*fDiag[%2d];\n",
68 i*(i+1)/2+j,(i-1)*i/2+j,j,i);
c98a50a1 69#endif
4d209fca 70 cmat[i*(i+1)/2+j] = fODia[(i-1)*i/2+j]*fDiag[j]*fDiag[i];}
71
72 // Diagonal elements
c98a50a1 73#ifdef DEBUG
4d209fca 74 printf("cmat[%2d] = fDiag[%2d]*fDiag[%2d];\n",
75 i*(i+1)/2+i,i,i);
c98a50a1 76#endif
4d209fca 77 cmat[i*(i+1)/2+i] = fDiag[i]*fDiag[i];
78 }
79}
df9db588 80
df9db588 81
4d209fca 82//______________________________________________________________________________
c98a50a1 83template <Int_t N> template <class T> inline void AliAODRedCov<N>::SetCovMatrix(T *cmat)
4d209fca 84{
85 //
86 // Sets the external cov matrix
87 //
df9db588 88
4d209fca 89 if(cmat) {
90 // Diagonal elements first
91 for(Int_t i=0; i<N; ++i) {
c98a50a1 92#ifdef DEBUG
4d209fca 93 printf("fDiag[%2d] = TMath::Sqrt(cmat[%2d]);\n",
94 i,i*(i+1)/2+i);
c98a50a1 95#endif
4d209fca 96 fDiag[i] = TMath::Sqrt(cmat[i*(i+1)/2+i]);}
97
98 // ... then the ones off diagonal
99 for(Int_t i=0; i<N; ++i)
100 // Off diagonal elements
101 for(Int_t j=0; j<i; ++j) {
c98a50a1 102#ifdef DEBUG
4d209fca 103 printf("fODia[%2d] = cmat[%2d]/(fDiag[%2d]*fDiag[%2d]);\n",
104 (i-1)*i/2+j,i*(i+1)/2+j,j,i);
c98a50a1 105#endif
4d209fca 106 fODia[(i-1)*i/2+j] = cmat[i*(i+1)/2+j]/(fDiag[j]*fDiag[i]);
107 }
108 } else {
109 for(Int_t i=0; i< N; ++i) fDiag[i]=-999.;
110 for(Int_t i=0; i< N*(N-1)/2; ++i) fODia[i]=0.;
111 }
112}
113
c98a50a1 114#undef DEBUG
115
4d209fca 116#endif
df9db588 117#endif