ROOT logo
/**************************************************************************
 * Copyright(c) 2001-2002, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */

////////////////////////////////////////////////////////////////////////
// Class used to generate correlated gaussian numbers with mean
// zero and known covariance matrix.
// Adapted from the Fortran code in Cernlib V122 (corset, corgen)
// F. James, Monte Carlo theory and practice, 
// Rep. Prog. Phys. 43 (1980) 1145-1189. 
// M.Masera 15.03.2001 9:30 - modified on 26.02.2002 17:40
////////////////////////////////////////////////////////////////////////

#include <Riostream.h>
#include <TArrayD.h>
#include <TMath.h>
#include <TRandom.h>

#include "AliGausCorr.h"

ClassImp(AliGausCorr)

//_______________________________________________________________________
AliGausCorr::AliGausCorr():
  fSize(0),
  fCv(0)
{
  //
  // Default constructor
  //
}

//_______________________________________________________________________
AliGausCorr::AliGausCorr(const TMatrixD & vec, Int_t size):
  fSize(size),
  fCv(new TMatrixD(fSize,fSize))
{
  //
  // Standard constructor
  //
  for(Int_t j=0;j<fSize;j++){
    double accum = 0;
    for(Int_t k=0;k<j;k++){
      accum += (*fCv)(j,k)* (*fCv)(j,k);
    }
    (*fCv)(j,j)=TMath::Sqrt(TMath::Abs(vec(j,j)-accum));
    for(Int_t i=j+1;i<fSize;i++){
      accum = 0;
      for(Int_t k=0;k<j;k++){
	accum+=(*fCv)(i,k)* (*fCv)(j,k);
      }
      (*fCv)(i,j) = (vec(i,j)-accum) / (*fCv)(j,j);
    }
  }
}

//_______________________________________________________________________
AliGausCorr::AliGausCorr(const AliGausCorr & tgcorr):
  TObject(tgcorr),
  fSize(tgcorr.fSize),
  fCv(new TMatrixD(fSize,fSize))
{
  //
  // Copy contructor
  //
  for(Int_t i=0;i<fSize;i++){
    for(Int_t j=0;j<fSize;j++)(*fCv)(i,j)=(*tgcorr.fCv)(i,j);
  }
}

//_______________________________________________________________________
AliGausCorr::~AliGausCorr()
{
  // Destructor
  delete fCv;
}

//_______________________________________________________________________
void AliGausCorr::GetGaussN(TArrayD &vec) const
{
  // return fSize correlated gaussian numbers

  TArrayD tmpv(fSize);

  for(Int_t i=0; i<fSize; i++){
    Double_t x, y, z;
    do {
      y = gRandom->Rndm();
    } while (!y);
    z = gRandom->Rndm();
    x = z * 6.283185;
    tmpv[i] = TMath::Sin(x)*TMath::Sqrt(-2*TMath::Log(y));
  }

  for(Int_t i=0;i<fSize;i++){
    vec[i]=0;
    for(Int_t j=0;j<=i;j++)vec[i] += (*fCv)(i,j)* tmpv[j];
  }

}

//_______________________________________________________________________
void AliGausCorr::PrintCv() const
{
  // Printout of the "square root" cov. matrix 
  printf("\n AliGausCorr - triangular matrix \n");
  for(Int_t i=0; i<fSize;i++){
    for(Int_t j=0;j<(fSize-1);j++){
      if(j==0){
        printf("| %12.4f ",(*fCv)(i,j));
      }
      else {
        printf(" %12.4f ",(*fCv)(i,j));
      }
    }
    printf(" %12.4f | \n",(*fCv)(i,fSize-1));
  }
  printf("\n");
}

//_______________________________________________________________________
AliGausCorr & AliGausCorr::operator=(const AliGausCorr & tgcorr)
{
  // Assignment operator
  if(&tgcorr != this && tgcorr.fSize!=fSize){
    if(fCv)delete fCv;
    fSize = tgcorr.fSize;
    fCv = new TMatrixD(fSize,fSize);
  }
  if(&tgcorr != this){
    for(Int_t i=0;i<fSize;i++){
      for(Int_t j=0;j<fSize;j++)(*fCv)(i,j)=(*tgcorr.fCv)(i,j);
    }
  }

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