001 #include "AtlfastAlgs/CorrelatedData.h"
002 #include <cmath>
003
004 namespace Atlfast{
005 using std::abs;
006 using std::pair;
007 using std::vector;
008 using std::cout;
009 using std::endl;
010
011
012
013
014 CorrelatedData::CorrelatedData(int randSeed) {
015 m_randomEngine = new HepJamesRandom( randSeed );
016 m_ellipse = pair<double,double>(0.27597,0.27846);
017 m_stFactors = pair<double, double>(0.449871,-0.386595);
018 m_abFactors = pair<double, double>(0.19600,0.25472);
019 }
020
021 vector<double> CorrelatedData::normal(int nDev) const{
022 vector<double> deviates;
023 double deviate;
024 for (int i=0; i<nDev; i++)
025 {
026 bool success=false;
027 while (success == false) {
028 pair<double,double> randoms( m_randomEngine->flat(),
029 m_randomEngine->flat() );
030 success = makeDeviate(randoms, deviate);
031 }
032
033 deviates.push_back(deviate);
034 }
035 return deviates;
036 }
037
038 bool CorrelatedData::makeDeviate(pair<double,double> randoms,
039 double& deviate) const{
040
041 double v, x, y, q;
042 bool success = false;
043
044
045 v = 1.7156*(randoms.second - 0.5);
046 x = randoms.first - m_stFactors.first;
047 y = abs(v) - m_stFactors.second;
048 q = x*x + y*( (m_abFactors.first)*y - (m_abFactors.second)*x);
049
050 if ( (q <= m_ellipse.second) &&
051 (v*v <= -4*log( (randoms.first) ) * (randoms.first) * (randoms.first) )
052 ) success = true;
053 if ( (q < m_ellipse.first) || success )
054 {
055 deviate = v/(randoms.first);
056 return true;}
057 else
058 {return false;}
059
060 }
061
062 vector<double> CorrelatedData::generate(const HepMatrix& matrix) const{
063
064 int size = matrix.num_col();
065 if( size != matrix.num_row() ) {
066 cout << "CorrelatedData: WARNING: Matrix not square; using sub matrix"
067 << endl;
068 size = size < matrix.num_row() ? size : matrix.num_row();
069 }
070
071 vector<double> generated(size,0.0);
072 vector<double> norm = normal(size);
073
074 for (int i = 0; i < size; i++) {
075 generated[i]=0;
076 for (int j = 0; j < i+1; j++){
077 generated[i] += matrix[i][j]*norm[j];
078 }
079 }
080 return generated;
081 }
082
083 double CorrelatedData::generate(double element) const{
084 HepMatrix matrix(1,1,0);
085 matrix(1,1) = element;
086 return (generate(matrix)).front();
087 }
088
089 HepMatrix CorrelatedData::root(const HepMatrix& matrix) const{
090 int size = matrix.num_col();
091 if( size != matrix.num_row() ) {
092 cout << "CorrelatedData: WARNING: Matrix not square; using sub matrix"
093 << endl;
094 size = size < matrix.num_row() ? size : matrix.num_row();
095 }
096
097 HepMatrix sqRoot(size, size, 0);
098 double ck, rootElementSquared;
099
100
101
102 for (int j = 0; j < size; j++) {
103
104 ck = 0;
105 for (int k = 0; k < j; k++){
106 ck += sqRoot[j][k]*sqRoot[j][k];
107 }
108 if ( ( rootElementSquared = abs(matrix[j][j]) - ck ) < 0 ) {
109 sqRoot[j][j] = 1;
110 cout << "CorrelatedData: WARNING: CRITICAL error in 'root(matrix)'"
111 << endl;
112 }else{
113 sqRoot[j][j] = sqrt(rootElementSquared);}
114
115 for (int l = j+1; l < size; l++){
116 ck = 0;
117 for (int m = 0; m < j; m++){
118 ck += sqRoot[l][m]*sqRoot[j][m];
119 }
120
121 sqRoot[l][j] = (matrix[l][j] - ck)/sqRoot[j][j];
122 }
123
124 }
125 return sqRoot;
126 }
127
128 }
129
| Due to the LXR bug, the updates fail sometimes to remove references to deleted files. The Saturday's full rebuilds fix these problems |
|
This page was automatically generated by the
LXR engine.
|
|