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