Generation of N gaussian numbers through a known covariance matrix. It probably will...
authorhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 7 Mar 2002 08:39:51 +0000 (08:39 +0000)
committerhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 7 Mar 2002 08:39:51 +0000 (08:39 +0000)
STEER/AliGausCorr.cxx [new file with mode: 0644]
STEER/AliGausCorr.h [new file with mode: 0644]
STEER/Makefile
STEER/STEERLinkDef.h
STEER/libSTEER.pkg

diff --git a/STEER/AliGausCorr.cxx b/STEER/AliGausCorr.cxx
new file mode 100644 (file)
index 0000000..15f8f26
--- /dev/null
@@ -0,0 +1,144 @@
+/**************************************************************************
+ * 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.                  *
+ **************************************************************************/
+
+////////////////////////////////////////////////////////////////////////
+// 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 <iostream.h>
+#include <TArrayD.h>
+#include <TMatrixD.h>
+#include <TRandom.h>
+#include "AliGausCorr.h"
+
+ClassImp(AliGausCorr)
+
+//________________________________________________________
+AliGausCorr::AliGausCorr()
+{
+  // Default constructor
+  fSize = 0;
+  fCv = 0;
+}
+
+//________________________________________________________
+AliGausCorr::AliGausCorr(const TMatrixD & vec, Int_t size) 
+{
+  // Standard constructor
+  fSize = size;
+  fCv = new TMatrixD(fSize,fSize);
+  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)
+{
+  // Copy contructor
+
+  fSize = tgcorr.fSize;
+  fCv = new TMatrixD(fSize,fSize);
+  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)
+{
+  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;
+}
+
+
+
+
+
diff --git a/STEER/AliGausCorr.h b/STEER/AliGausCorr.h
new file mode 100644 (file)
index 0000000..62123eb
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef ALIGAUSCORR_H
+#define ALIGAUSCORR_H
+/* Copyright(c) 2001-2002, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+#include <TMatrixD.h>
+class TArrayD;
+
+
+class AliGausCorr : public TObject {
+////////////////////////////////////////////////////////////////////////
+// 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 14.03.2001 19:30 - last mod. 26.02.2002 17:45
+////////////////////////////////////////////////////////////////////////
+ public:
+  //
+  AliGausCorr();
+  AliGausCorr(const TMatrixD & cov, Int_t size);
+  AliGausCorr(const AliGausCorr & tgcorr);
+  virtual ~AliGausCorr();
+  void GetGaussN(TArrayD &vec) const;
+  TMatrixD GetSqrtMatrix() const { return *fCv;}
+  void PrintCv() const;
+  AliGausCorr & operator=(const AliGausCorr & tgcorr);
+  //
+ private:
+  //
+  Int_t fSize;   // number of correlated gaussian random numbers
+  TMatrixD *fCv; // 'square root' of the covariance matrix
+
+  ClassDef(AliGausCorr,1)  
+};
+
+
+#endif
+
+
+
index b5f9a99..1799215 100644 (file)
@@ -23,7 +23,8 @@ SRCS          = AliDetector.cxx       AliHeader.cxx   AliMagF.cxx \
                AliGenEventHeader.cxx AliStack.cxx AliConfig.cxx \
                AliRunDigitizer.cxx AliDigitizer.cxx\
                AliStream.cxx AliMergeCombi.cxx \
-               AliMagFMaps.cxx AliFieldMap.cxx
+               AliMagFMaps.cxx AliFieldMap.cxx \
+        AliGausCorr.cxx
 
 # C++ Headers
 
index 969c408..016e86a 100644 (file)
@@ -55,6 +55,7 @@
 #pragma link C++ class  AliStream+;
 #pragma link C++ class  AliMergeCombi+;
 #pragma link C++ class  AliFieldMap-;
+#pragma link C++ class  AliGaussCorr+;
 
 #endif
 
index f6444ef..b743351 100644 (file)
@@ -12,7 +12,8 @@ AliKalmanTrack.cxx AliCluster.cxx AliTracker.cxx\
 AliMCQA.cxx AliPDG.cxx AliDebugVolume.cxx \
 AliGenEventHeader.cxx AliStack.cxx AliConfig.cxx \
 AliRunDigitizer.cxx AliDigitizer.cxx AliStream.cxx \
-AliMergeCombi.cxx AliMagFMaps.cxx AliFieldMap.cxx
+AliMergeCombi.cxx AliMagFMaps.cxx AliFieldMap.cxx \
+AliGausCorr.cxx
 
 HDRS:= $(SRCS:.cxx=.h)