Gaudi Framework, version v23r4

Home   Generated: Mon Sep 17 2012

HepRndmGenerators.cpp

Go to the documentation of this file.
00001 //====================================================================
00002 //      Random Generator implementations
00003 //--------------------------------------------------------------------
00004 //
00005 //      Package    : Gaudi/RndmGen ( The LHCb Offline System)
00006 //      Author     : M.Frank
00007 //  History    :
00008 // +---------+----------------------------------------------+---------
00009 // |    Date |                 Comment                      | Who     
00010 // +---------+----------------------------------------------+---------
00011 // | 29/10/99| Initial version                              | MF
00012 // +---------+----------------------------------------------+---------
00013 //
00014 //====================================================================
00015 #define HEPRNDM_HEPRNDMGENSVC_CPP
00016 
00017 // Framework include files
00018 #include "GaudiKernel/ObjectFactory.h"
00019 
00020 // STL include files
00021 #include <iostream>
00022 #include <cfloat>
00023 #include <cmath>
00024 
00025 // The order of the following two include files is significant due to template specialisation
00026 #include "RndmGen.h"
00027 #include "RndmGenSvc.h"
00028 #include "HepRndmGenerator.h"
00029 #include "GaudiKernel/RndmGenerators.h"
00030 #include "GaudiKernel/IIncidentSvc.h"
00031 
00032 #include "CLHEP/Random/RandomEngine.h"
00033 #include "CLHEP/Random/RandFlat.h"
00034 #include "CLHEP/Random/RandGamma.h"
00035 #include "CLHEP/Random/RandGaussQ.h"
00036 #include "CLHEP/Random/RandPoisson.h"
00037 #include "CLHEP/Random/RandGeneral.h"
00038 #include "CLHEP/Random/RandStudentT.h"
00039 #include "CLHEP/Random/RandBinomial.h"
00040 #include "CLHEP/Random/RandChiSquare.h"
00041 #include "CLHEP/Random/RandExponential.h"
00042 #include "CLHEP/Random/RandBreitWigner.h"
00043 
00044 // Handle CLHEP 2.0.x move to CLHEP namespace
00045 namespace CLHEP { }
00046 using namespace CLHEP;
00047 
00048 namespace HepRndm  {
00049 
00050   // Specialized shoot function for flat distributed random number generation
00051   template <> double Generator<Rndm::Flat>::shoot()    const     {
00052     return RandFlat::shoot(m_hepEngine, m_specs->minimum(), m_specs->maximum());
00053   }
00054 
00055   // Specialized shoot function
00056   template <> double Generator<Rndm::Bit>::shoot()    const     {
00057     return RandFlat::shootBit(m_hepEngine);
00058   }
00059 
00060   // Specialized shoot function for Gauss distributed random number generation
00061   template <> double Generator<Rndm::Gauss>::shoot()    const     {
00062     return RandGaussQ::shoot(m_hepEngine, m_specs->mean(), m_specs->sigma());
00063   }
00064 
00065 #ifdef __ICC
00066 // disable icc remark #2259: non-pointer conversion from "X" to "Y" may lose significant bits
00067 //   Mandatory because RandPoisson::shoot returns "long"
00068 #pragma warning(push)
00069 #pragma warning(disable:2259)
00070 #endif
00071   // Specialized shoot function for Poisson distributed random number generation
00072   template <> double Generator<Rndm::Poisson>::shoot()    const     {
00073     return RandPoisson::shoot(m_hepEngine, m_specs->mean());
00074   }
00075 
00076 #ifdef __ICC
00077 // re-enable icc remark #2259
00078 #pragma warning(pop)
00079 #endif
00080 
00081   // Specialized shoot function
00082   template <> double Generator<Rndm::Exponential>::shoot()    const     {
00083     return RandExponential::shoot(m_hepEngine, m_specs->mean());
00084   }
00085 
00086   // Specialized shoot function
00087   template <> double Generator<Rndm::BreitWigner>::shoot()    const     {
00088     return RandBreitWigner::shoot(m_hepEngine, m_specs->mean(), m_specs->gamma());
00089   }
00090 
00091   // Specialized shoot function
00092   template <> double Generator<Rndm::BreitWignerCutOff>::shoot()    const     {
00093     return RandBreitWigner::shoot(m_hepEngine, m_specs->mean(), m_specs->gamma(), m_specs->cutOff());
00094   }
00095 
00096   // Specialized shoot function
00097   template <> double Generator<Rndm::Chi2>::shoot()    const     {
00098     return RandChiSquare::shoot(m_hepEngine, m_specs->nDOF());
00099   }
00100 
00101   // Specialized shoot function
00102   template <> double Generator<Rndm::StudentT>::shoot()    const     {
00103     return RandStudentT::shoot(m_hepEngine, m_specs->aValue());
00104   }
00105 
00106   template <> double Generator<Rndm::Gamma>::shoot()    const     {
00107     return RandGamma::shoot(m_hepEngine, m_specs->kValue(), m_specs->lambda());
00108   }
00109 
00110   // Specialized shoot function
00111   template <> double Generator<Rndm::Binomial>::shoot()    const     {
00112     return RandBinomial::shoot(m_hepEngine, m_specs->nEvent(), m_specs->probability());
00113   }
00114 
00115   /************************************************************************
00116   * Copyright(c) 1995-1999, The ROOT System, All rights reserved.         *
00117   * Authors: Rene Brun, Fons Rademakers.                                  *
00118   * For list of contributors see $ROOTSYS/AA_CREDITS.                     *
00119   *                                                                       *
00120   * Permission to use, copy, modify and distribute this software and its  *
00121   * documentation for non-commercial purposes is hereby granted without   *
00122   * fee, provided that the above copyright notice appears in all copies   *
00123   * and that both the copyright notice and this permission notice appear  *
00124   * in the supporting documentation. The authors make no claims about the *
00125   * suitability of this software for any purpose. It is provided "as is"  *
00126   * without express or implied warranty.                                  *
00127   ************************************************************************/
00128   // Specialized shoot function. The Landau distribution is not covered by
00129   // CLHEP yet. This is hacked up version from ROOT. The above copyright notice
00130   // should give the guys credit.
00131   template <> double Generator<Rndm::Landau>::shoot()    const     {
00132   //  Generate a random number following a Landau distribution
00133   //  with average value mean and rms
00134   //  Converted by Rene Brun from CERNLIB routine ranlan(G110)
00135   static double f[982] = {
00136        0       , 0       , 0       ,0        ,0        ,-2.244733,
00137       -2.204365,-2.168163,-2.135219,-2.104898,-2.076740,-2.050397,
00138       -2.025605,-2.002150,-1.979866,-1.958612,-1.938275,-1.918760,
00139       -1.899984,-1.881879,-1.864385,-1.847451,-1.831030,-1.815083,
00140       -1.799574,-1.784473,-1.769751,-1.755383,-1.741346,-1.727620,
00141       -1.714187,-1.701029,-1.688130,-1.675477,-1.663057,-1.650858,
00142       -1.638868,-1.627078,-1.615477,-1.604058,-1.592811,-1.581729,
00143       -1.570806,-1.560034,-1.549407,-1.538919,-1.528565,-1.518339,
00144       -1.508237,-1.498254,-1.488386,-1.478628,-1.468976,-1.459428,
00145       -1.449979,-1.440626,-1.431365,-1.422195,-1.413111,-1.404112,
00146       -1.395194,-1.386356,-1.377594,-1.368906,-1.360291,-1.351746,
00147       -1.343269,-1.334859,-1.326512,-1.318229,-1.310006,-1.301843,
00148       -1.293737,-1.285688,-1.277693,-1.269752,-1.261863,-1.254024,
00149       -1.246235,-1.238494,-1.230800,-1.223153,-1.215550,-1.207990,
00150       -1.200474,-1.192999,-1.185566,-1.178172,-1.170817,-1.163500,
00151       -1.156220,-1.148977,-1.141770,-1.134598,-1.127459,-1.120354,
00152       -1.113282,-1.106242,-1.099233,-1.092255,
00153       -1.085306,-1.078388,-1.071498,-1.064636,-1.057802,-1.050996,
00154       -1.044215,-1.037461,-1.030733,-1.024029,-1.017350,-1.010695,
00155       -1.004064, -.997456, -.990871, -.984308, -.977767, -.971247,
00156        -.964749, -.958271, -.951813, -.945375, -.938957, -.932558,
00157        -.926178, -.919816, -.913472, -.907146, -.900838, -.894547,
00158        -.888272, -.882014, -.875773, -.869547, -.863337, -.857142,
00159        -.850963, -.844798, -.838648, -.832512, -.826390, -.820282,
00160        -.814187, -.808106, -.802038, -.795982, -.789940, -.783909,
00161        -.777891, -.771884, -.765889, -.759906, -.753934, -.747973,
00162        -.742023, -.736084, -.730155, -.724237, -.718328, -.712429,
00163        -.706541, -.700661, -.694791, -.688931, -.683079, -.677236,
00164        -.671402, -.665576, -.659759, -.653950, -.648149, -.642356,
00165        -.636570, -.630793, -.625022, -.619259, -.613503, -.607754,
00166        -.602012, -.596276, -.590548, -.584825, -.579109, -.573399,
00167        -.567695, -.561997, -.556305, -.550618, -.544937, -.539262,
00168        -.533592, -.527926, -.522266, -.516611, -.510961, -.505315,
00169        -.499674, -.494037, -.488405, -.482777,
00170        -.477153, -.471533, -.465917, -.460305, -.454697, -.449092,
00171        -.443491, -.437893, -.432299, -.426707, -.421119, -.415534,
00172        -.409951, -.404372, -.398795, -.393221, -.387649, -.382080,
00173        -.376513, -.370949, -.365387, -.359826, -.354268, -.348712,
00174        -.343157, -.337604, -.332053, -.326503, -.320955, -.315408,
00175        -.309863, -.304318, -.298775, -.293233, -.287692, -.282152,
00176        -.276613, -.271074, -.265536, -.259999, -.254462, -.248926,
00177        -.243389, -.237854, -.232318, -.226783, -.221247, -.215712,
00178        -.210176, -.204641, -.199105, -.193568, -.188032, -.182495,
00179        -.176957, -.171419, -.165880, -.160341, -.154800, -.149259,
00180        -.143717, -.138173, -.132629, -.127083, -.121537, -.115989,
00181        -.110439, -.104889, -.099336, -.093782, -.088227, -.082670,
00182        -.077111, -.071550, -.065987, -.060423, -.054856, -.049288,
00183        -.043717, -.038144, -.032569, -.026991, -.021411, -.015828,
00184        -.010243, -.004656,  .000934,  .006527,  .012123,  .017722,
00185         .023323,  .028928,  .034535,  .040146,  .045759,  .051376,
00186         .056997,  .062620,  .068247,  .073877,
00187         .079511,  .085149,  .090790,  .096435,  .102083,  .107736,
00188         .113392,  .119052,  .124716,  .130385,  .136057,  .141734,
00189         .147414,  .153100,  .158789,  .164483,  .170181,  .175884,
00190         .181592,  .187304,  .193021,  .198743,  .204469,  .210201,
00191         .215937,  .221678,  .227425,  .233177,  .238933,  .244696,
00192         .250463,  .256236,  .262014,  .267798,  .273587,  .279382,
00193         .285183,  .290989,  .296801,  .302619,  .308443,  .314273,
00194         .320109,  .325951,  .331799,  .337654,  .343515,  .349382,
00195         .355255,  .361135,  .367022,  .372915,  .378815,  .384721,
00196         .390634,  .396554,  .402481,  .408415,  .414356,  .420304,
00197         .426260,  .432222,  .438192,  .444169,  .450153,  .456145,
00198         .462144,  .468151,  .474166,  .480188,  .486218,  .492256,
00199         .498302,  .504356,  .510418,  .516488,  .522566,  .528653,
00200         .534747,  .540850,  .546962,  .553082,  .559210,  .565347,
00201         .571493,  .577648,  .583811,  .589983,  .596164,  .602355,
00202         .608554,  .614762,  .620980,  .627207,  .633444,  .639689,
00203         .645945,  .652210,  .658484,  .664768,
00204         .671062,  .677366,  .683680,  .690004,  .696338,  .702682,
00205         .709036,  .715400,  .721775,  .728160,  .734556,  .740963,
00206         .747379,  .753807,  .760246,  .766695,  .773155,  .779627,
00207         .786109,  .792603,  .799107,  .805624,  .812151,  .818690,
00208         .825241,  .831803,  .838377,  .844962,  .851560,  .858170,
00209         .864791,  .871425,  .878071,  .884729,  .891399,  .898082,
00210         .904778,  .911486,  .918206,  .924940,  .931686,  .938446,
00211         .945218,  .952003,  .958802,  .965614,  .972439,  .979278,
00212         .986130,  .992996,  .999875, 1.006769, 1.013676, 1.020597,
00213        1.027533, 1.034482, 1.041446, 1.048424, 1.055417, 1.062424,
00214        1.069446, 1.076482, 1.083534, 1.090600, 1.097681, 1.104778,
00215        1.111889, 1.119016, 1.126159, 1.133316, 1.140490, 1.147679,
00216        1.154884, 1.162105, 1.169342, 1.176595, 1.183864, 1.191149,
00217        1.198451, 1.205770, 1.213105, 1.220457, 1.227826, 1.235211,
00218        1.242614, 1.250034, 1.257471, 1.264926, 1.272398, 1.279888,
00219        1.287395, 1.294921, 1.302464, 1.310026, 1.317605, 1.325203,
00220        1.332819, 1.340454, 1.348108, 1.355780,
00221        1.363472, 1.371182, 1.378912, 1.386660, 1.394429, 1.402216,
00222        1.410024, 1.417851, 1.425698, 1.433565, 1.441453, 1.449360,
00223        1.457288, 1.465237, 1.473206, 1.481196, 1.489208, 1.497240,
00224        1.505293, 1.513368, 1.521465, 1.529583, 1.537723, 1.545885,
00225        1.554068, 1.562275, 1.570503, 1.578754, 1.587028, 1.595325,
00226        1.603644, 1.611987, 1.620353, 1.628743, 1.637156, 1.645593,
00227        1.654053, 1.662538, 1.671047, 1.679581, 1.688139, 1.696721,
00228        1.705329, 1.713961, 1.722619, 1.731303, 1.740011, 1.748746,
00229        1.757506, 1.766293, 1.775106, 1.783945, 1.792810, 1.801703,
00230        1.810623, 1.819569, 1.828543, 1.837545, 1.846574, 1.855631,
00231        1.864717, 1.873830, 1.882972, 1.892143, 1.901343, 1.910572,
00232        1.919830, 1.929117, 1.938434, 1.947781, 1.957158, 1.966566,
00233        1.976004, 1.985473, 1.994972, 2.004503, 2.014065, 2.023659,
00234        2.033285, 2.042943, 2.052633, 2.062355, 2.072110, 2.081899,
00235        2.091720, 2.101575, 2.111464, 2.121386, 2.131343, 2.141334,
00236        2.151360, 2.161421, 2.171517, 2.181648, 2.191815, 2.202018,
00237        2.212257, 2.222533, 2.232845, 2.243195,
00238        2.253582, 2.264006, 2.274468, 2.284968, 2.295507, 2.306084,
00239        2.316701, 2.327356, 2.338051, 2.348786, 2.359562, 2.370377,
00240        2.381234, 2.392131, 2.403070, 2.414051, 2.425073, 2.436138,
00241        2.447246, 2.458397, 2.469591, 2.480828, 2.492110, 2.503436,
00242        2.514807, 2.526222, 2.537684, 2.549190, 2.560743, 2.572343,
00243        2.583989, 2.595682, 2.607423, 2.619212, 2.631050, 2.642936,
00244        2.654871, 2.666855, 2.678890, 2.690975, 2.703110, 2.715297,
00245        2.727535, 2.739825, 2.752168, 2.764563, 2.777012, 2.789514,
00246        2.802070, 2.814681, 2.827347, 2.840069, 2.852846, 2.865680,
00247        2.878570, 2.891518, 2.904524, 2.917588, 2.930712, 2.943894,
00248        2.957136, 2.970439, 2.983802, 2.997227, 3.010714, 3.024263,
00249        3.037875, 3.051551, 3.065290, 3.079095, 3.092965, 3.106900,
00250        3.120902, 3.134971, 3.149107, 3.163312, 3.177585, 3.191928,
00251        3.206340, 3.220824, 3.235378, 3.250005, 3.264704, 3.279477,
00252        3.294323, 3.309244, 3.324240, 3.339312, 3.354461, 3.369687,
00253        3.384992, 3.400375, 3.415838, 3.431381, 3.447005, 3.462711,
00254        3.478500, 3.494372, 3.510328, 3.526370,
00255        3.542497, 3.558711, 3.575012, 3.591402, 3.607881, 3.624450,
00256        3.641111, 3.657863, 3.674708, 3.691646, 3.708680, 3.725809,
00257        3.743034, 3.760357, 3.777779, 3.795300, 3.812921, 3.830645,
00258        3.848470, 3.866400, 3.884434, 3.902574, 3.920821, 3.939176,
00259        3.957640, 3.976215, 3.994901, 4.013699, 4.032612, 4.051639,
00260        4.070783, 4.090045, 4.109425, 4.128925, 4.148547, 4.168292,
00261        4.188160, 4.208154, 4.228275, 4.248524, 4.268903, 4.289413,
00262        4.310056, 4.330832, 4.351745, 4.372794, 4.393982, 4.415310,
00263        4.436781, 4.458395, 4.480154, 4.502060, 4.524114, 4.546319,
00264        4.568676, 4.591187, 4.613854, 4.636678, 4.659662, 4.682807,
00265        4.706116, 4.729590, 4.753231, 4.777041, 4.801024, 4.825179,
00266        4.849511, 4.874020, 4.898710, 4.923582, 4.948639, 4.973883,
00267        4.999316, 5.024942, 5.050761, 5.076778, 5.102993, 5.129411,
00268        5.156034, 5.182864, 5.209903, 5.237156, 5.264625, 5.292312,
00269        5.320220, 5.348354, 5.376714, 5.405306, 5.434131, 5.463193,
00270        5.492496, 5.522042, 5.551836, 5.581880, 5.612178, 5.642734,
00271        5.673552, 5.704634, 5.735986, 5.767610,
00272        5.799512, 5.831694, 5.864161, 5.896918, 5.929968, 5.963316,
00273        5.996967, 6.030925, 6.065194, 6.099780, 6.134687, 6.169921,
00274        6.205486, 6.241387, 6.277630, 6.314220, 6.351163, 6.388465,
00275        6.426130, 6.464166, 6.502578, 6.541371, 6.580553, 6.620130,
00276        6.660109, 6.700495, 6.741297, 6.782520, 6.824173, 6.866262,
00277        6.908795, 6.951780, 6.995225, 7.039137, 7.083525, 7.128398,
00278        7.173764, 7.219632, 7.266011, 7.312910, 7.360339, 7.408308,
00279        7.456827, 7.505905, 7.555554, 7.605785, 7.656608, 7.708035,
00280        7.760077, 7.812747, 7.866057, 7.920019, 7.974647, 8.029953,
00281        8.085952, 8.142657, 8.200083, 8.258245, 8.317158, 8.376837,
00282        8.437300, 8.498562, 8.560641, 8.623554, 8.687319, 8.751955,
00283        8.817481, 8.883916, 8.951282, 9.019600, 9.088889, 9.159174,
00284        9.230477, 9.302822, 9.376233, 9.450735, 9.526355, 9.603118,
00285        9.681054, 9.760191, 9.840558, 9.922186,10.005107,10.089353,
00286       10.174959,10.261958,10.350389,10.440287,10.531693,10.624646,
00287       10.719188,10.815362,10.913214,11.012789,11.114137,11.217307,
00288       11.322352,11.429325,11.538283,11.649285,
00289       11.762390,11.877664,11.995170,12.114979,12.237161,12.361791,
00290       12.488946,12.618708,12.751161,12.886394,13.024498,13.165570,
00291       13.309711,13.457026,13.607625,13.761625,13.919145,14.080314,
00292       14.245263,14.414134,14.587072,14.764233,14.945778,15.131877,
00293       15.322712,15.518470,15.719353,15.925570,16.137345,16.354912,
00294       16.578520,16.808433,17.044929,17.288305,17.538873,17.796967,
00295       18.062943,18.337176,18.620068,18.912049,19.213574,19.525133,
00296       19.847249,20.180480,20.525429,20.882738,21.253102,21.637266,
00297       22.036036,22.450278,22.880933,23.329017,23.795634,24.281981,
00298       24.789364,25.319207,25.873062,26.452634,27.059789,27.696581,
00299       28.365274,29.068370,29.808638,30.589157,31.413354,32.285060,
00300       33.208568,34.188705,35.230920,36.341388,37.527131,38.796172,
00301       40.157721,41.622399,43.202525,44.912465,46.769077,48.792279,
00302       51.005773,53.437996,56.123356,59.103894 };
00303 
00304     if ( m_specs->sigma() > 0 )    {
00305       double mean = m_specs->mean();
00306       double sigma = m_specs->sigma();
00307       double x = RandFlat::shoot(m_hepEngine, 0., 1.);
00308       double u = 1000.0*x;
00309       long i = long(u);
00310       double ranlan, v;
00311       u -= i;
00312       if (i >= 70 && i < 800) {
00313          ranlan = f[i-1] + u*(f[i] - f[i-1]);
00314       } else if (i >= 7 && i <= 980) {
00315          ranlan =  f[i-1] + u*(f[i]-f[i-1]-0.25*(1-u)*(f[i+1]-f[i]-f[i-1]+f[i-2]));
00316       } else if (i < 7) {
00317          v = log(x);
00318          u = 1/v;
00319          ranlan = ((0.99858950+(3.45213058E1+1.70854528E1*u)*u)/
00320                    (1         +(3.41760202E1+4.01244582  *u)*u))*
00321                    (-log(-0.91893853-v)-1);
00322       } else {
00323          u = 1-x;
00324          v = u*u;
00325          if (x <= 0.999) {
00326           ranlan = (1.00060006+2.63991156E2*u+4.37320068E3*v)/
00327                   ((1         +2.57368075E2*u+3.41448018E3*v)*u);
00328          } else {
00329           ranlan = (1.00001538+6.07514119E3*u+7.34266409E5*v)/
00330                   ((1         +6.06511919E3*u+6.94021044E5*v)*u);
00331          }
00332       }
00333       return mean + sigma*ranlan;
00334     }
00335     return DBL_MAX;
00336   }
00337 
00338   template <>
00339   class Generator<Rndm::DefinedPdf> : public RndmGen   {
00340   protected:
00341     RandGeneral*     m_generator;
00342     HepRandomEngine* m_hepEngine;
00343   public: 
00345     Generator(IInterface* engine)
00346     : RndmGen (engine), m_generator(0), m_hepEngine(0)    {
00347     }
00349     virtual ~Generator() {
00350     }
00352     virtual StatusCode initialize(const IRndmGen::Param& par)   {
00353       StatusCode status = RndmGen::initialize(par);
00354       if ( status.isSuccess() )   {
00355         try   {
00356           Rndm::DefinedPdf* specs = dynamic_cast<Rndm::DefinedPdf*>(m_params);
00357           if ( 0 != specs )  {
00358             m_generator = new RandGeneral( &specs->pdf()[0],
00359                                            specs->pdf().size(), 
00360                                            specs->interpolation());
00361             BaseEngine* engine = dynamic_cast<BaseEngine*>(m_engine);
00362             if ( 0 != engine )    {
00363               m_hepEngine = engine->hepEngine();
00364               if ( 0 != m_hepEngine )   {
00365                 return StatusCode::SUCCESS;
00366               }
00367             }
00368           }
00369         }
00370         catch (...)   {
00371         }
00372       }
00373       return StatusCode::FAILURE;
00374     }
00376     virtual StatusCode finalize()   {
00377       if ( m_generator ) delete m_generator;
00378       m_generator = 0;
00379       return RndmGen::finalize();
00380     }
00382     virtual double shoot() const    {
00383       return m_generator->shoot(m_hepEngine);
00384     }
00385   };
00386 
00387 #ifdef __ICC
00388 // disable icc remark #1572: floating-point equality and inequality comparisons are unreliable
00389 //   The comparison is meant
00390 #pragma warning(push)
00391 #pragma warning(disable:1572)
00392 #endif
00393   // Specialized shoot function
00394   template <> double Generator<Rndm::GaussianTail>::shoot()    const     {
00395     /* Code obtained and adapted from GSL 
00396      gsl_ran_gaussian_tail (const gsl_rng * r, const double a, const double sigma)
00397      Returns a gaussian random variable larger than a
00398      This implementation does one-sided upper-tailed deviates.
00399     */
00400     double a = m_specs->cut();
00401     double sigma = m_specs->sigma();
00402     double s = a / sigma;
00403     if (s < 1) {
00404       /* For small s, use a direct rejection method. The limit s < 1
00405          can be adjusted to optimise the overall efficiency */
00406       double x;
00407       do {
00408               //x = gsl_ran_gaussian (r, 1.0);
00409         x = RandGaussQ::shoot(m_hepEngine, 0.0, 1.0);
00410       } while (x < s);
00411       return x * sigma;
00412     } else {
00413       /* Use the "supertail" deviates from the last two steps
00414        * of Marsaglia's rectangle-wedge-tail method, as described
00415        * in Knuth, v2, 3rd ed, pp 123-128.  (See also exercise 11, p139,
00416        * and the solution, p586.)
00417        */
00418       double u, v, x;
00419       do {
00420               // u = gsl_rng_uniform (r);
00421         u = RandFlat::shoot(m_hepEngine);
00422         do {
00423           // v = gsl_rng_uniform (r);
00424           v = RandFlat::shoot(m_hepEngine);
00425         } while (v == 0.0);
00426               x = sqrt (s * s - 2 * log (v));
00427       } while (x * u > s);
00428       return x * sigma;
00429     }
00430 #ifdef __ICC
00431 // re-enable icc remark #1572
00432 #pragma warning(pop)
00433 #endif
00434   } 
00435 }
00436 
00437 
00438 using namespace Rndm;
00439 #define DECLARE_GENERATOR_FACTORY(x,i)   \
00440   typedef HepRndm::Generator<x> b##i; \
00441   PLUGINSVC_FACTORY_WITH_ID(b##i,x::typeID(),IInterface*(IInterface*))
00442 
00443 
00444 DECLARE_GENERATOR_FACTORY(Bit,1)
00445 DECLARE_GENERATOR_FACTORY(Flat,2)
00446 DECLARE_GENERATOR_FACTORY(Chi2,3)
00447 DECLARE_GENERATOR_FACTORY(Gamma,4)
00448 DECLARE_GENERATOR_FACTORY(Gauss,5)
00449 DECLARE_GENERATOR_FACTORY(Landau,6)
00450 DECLARE_GENERATOR_FACTORY(Poisson,7)
00451 DECLARE_GENERATOR_FACTORY(StudentT,8)
00452 DECLARE_GENERATOR_FACTORY(Binomial,9)
00453 DECLARE_GENERATOR_FACTORY(Exponential,10)
00454 DECLARE_GENERATOR_FACTORY(BreitWigner,11)
00455 DECLARE_GENERATOR_FACTORY(BreitWignerCutOff,12)
00456 DECLARE_GENERATOR_FACTORY(DefinedPdf,13)
00457 DECLARE_GENERATOR_FACTORY(GaussianTail,14)
00458 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines

Generated at Mon Sep 17 2012 13:49:36 for Gaudi Framework, version v23r4 by Doxygen version 1.7.2 written by Dimitri van Heesch, © 1997-2004