Report problems to ATLAS LXR Team (with time and IP address indicated)

The LXR Cross Referencer

source navigation ]
diff markup ]
identifier search ]
general search ]
 
 
Architecture: linux ]
Version: head ] [ nightly ] [ GaudiDev ]
  Links to LXR source navigation pages for stable releases [ 12.*.* ]   [ 13.*.* ]   [ 14.*.* ]   [ 15.*.* ] 

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   /** @brief Class to smear parameters that are correlated. */
012   
013   /** Constructor accepts random seed */
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     //some maths stuff
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   /** Generates smeared parameters from input matrix */
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   /** Generates smeared parameter from input number */
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   /** Returns square root matrix of original matrix */
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     // FIND SQUARE ROOT OF MATRIX
101     
102     for (int j = 0; j < size; j++) {
103       // diagonals
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       //off diagonals
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 }//end of namespace
129 

source navigation ] diff markup ] identifier search ] general search ]

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. Valid HTML 4.01!