00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #define HEPRNDM_HEPRNDMGENSVC_CPP
00016
00017
00018 #include "GaudiKernel/ObjectFactory.h"
00019
00020
00021 #include <iostream>
00022 #include <cfloat>
00023 #include <cmath>
00024
00025
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
00045 namespace CLHEP { }
00046 using namespace CLHEP;
00047
00048 namespace HepRndm {
00049
00050
00051 template <> double Generator<Rndm::Flat>::shoot() const {
00052 return RandFlat::shoot(m_hepEngine, m_specs->minimum(), m_specs->maximum());
00053 }
00054
00055
00056 template <> double Generator<Rndm::Bit>::shoot() const {
00057 return RandFlat::shootBit(m_hepEngine);
00058 }
00059
00060
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
00067
00068 #pragma warning(push)
00069 #pragma warning(disable:2259)
00070 #endif
00071
00072 template <> double Generator<Rndm::Poisson>::shoot() const {
00073 return RandPoisson::shoot(m_hepEngine, m_specs->mean());
00074 }
00075
00076 #ifdef __ICC
00077
00078 #pragma warning(pop)
00079 #endif
00080
00081
00082 template <> double Generator<Rndm::Exponential>::shoot() const {
00083 return RandExponential::shoot(m_hepEngine, m_specs->mean());
00084 }
00085
00086
00087 template <> double Generator<Rndm::BreitWigner>::shoot() const {
00088 return RandBreitWigner::shoot(m_hepEngine, m_specs->mean(), m_specs->gamma());
00089 }
00090
00091
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
00097 template <> double Generator<Rndm::Chi2>::shoot() const {
00098 return RandChiSquare::shoot(m_hepEngine, m_specs->nDOF());
00099 }
00100
00101
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
00111 template <> double Generator<Rndm::Binomial>::shoot() const {
00112 return RandBinomial::shoot(m_hepEngine, m_specs->nEvent(), m_specs->probability());
00113 }
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131 template <> double Generator<Rndm::Landau>::shoot() const {
00132
00133
00134
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
00389
00390 #pragma warning(push)
00391 #pragma warning(disable:1572)
00392 #endif
00393
00394 template <> double Generator<Rndm::GaussianTail>::shoot() const {
00395
00396
00397
00398
00399
00400 double a = m_specs->cut();
00401 double sigma = m_specs->sigma();
00402 double s = a / sigma;
00403 if (s < 1) {
00404
00405
00406 double x;
00407 do {
00408
00409 x = RandGaussQ::shoot(m_hepEngine, 0.0, 1.0);
00410 } while (x < s);
00411 return x * sigma;
00412 } else {
00413
00414
00415
00416
00417
00418 double u, v, x;
00419 do {
00420
00421 u = RandFlat::shoot(m_hepEngine);
00422 do {
00423
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
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