Gaudi Framework, version v21r11

Home   Generated: 30 Sep 2010

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

Generated at Thu Sep 30 09:57:39 2010 for Gaudi Framework, version v21r11 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004