Changeset 1347 for trunk/source/event/src/G4SPSRandomGenerator.cc
- Timestamp:
- Dec 22, 2010, 3:52:27 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/event/src/G4SPSRandomGenerator.cc
r816 r1347 63 63 //G4SPSRandomGenerator* G4SPSRandomGenerator::instance = 0; 64 64 65 G4SPSRandomGenerator::G4SPSRandomGenerator() 66 { 67 // Initialise all variables 68 69 // Bias variables 70 71 IPDFXBias = false;72 73 IPDFYBias = false;74 75 IPDFZBias = false;76 77 IPDFThetaBias = false;78 79 IPDFPhiBias = false;80 81 IPDFEnergyBias = false;82 83 IPDFPosThetaBias = false;84 85 IPDFPosPhiBias = false; 86 bweights[0] = bweights[1] = bweights[2] = bweights[3] = bweights[4] = bweights[5] = bweights[6] = bweights[7]= bweights[8]= 1.;87 verbosityLevel = 0;88 } 89 90 G4SPSRandomGenerator::~G4SPSRandomGenerator() 91 {}65 G4SPSRandomGenerator::G4SPSRandomGenerator() { 66 // Initialise all variables 67 68 // Bias variables 69 XBias = false; 70 IPDFXBias = false; 71 YBias = false; 72 IPDFYBias = false; 73 ZBias = false; 74 IPDFZBias = false; 75 ThetaBias = false; 76 IPDFThetaBias = false; 77 PhiBias = false; 78 IPDFPhiBias = false; 79 EnergyBias = false; 80 IPDFEnergyBias = false; 81 PosThetaBias = false; 82 IPDFPosThetaBias = false; 83 PosPhiBias = false; 84 IPDFPosPhiBias = false; 85 bweights[0] = bweights[1] = bweights[2] = bweights[3] = bweights[4] 86 = bweights[5] = bweights[6] = bweights[7] = bweights[8] = 1.; 87 verbosityLevel = 0; 88 } 89 90 G4SPSRandomGenerator::~G4SPSRandomGenerator() { 91 } 92 92 93 93 //G4SPSRandomGenerator* G4SPSRandomGenerator::getInstance () … … 99 99 // Biasing methods 100 100 101 void G4SPSRandomGenerator::SetXBias(G4ThreeVector input) 102 { 103 G4double ehi, val; 104 ehi = input.x(); 105 val = input.y(); 106 XBiasH.InsertValues(ehi, val); 107 XBias = true; 108 } 109 110 void G4SPSRandomGenerator::SetYBias(G4ThreeVector input) 111 { 112 G4double ehi, val; 113 ehi = input.x(); 114 val = input.y(); 115 YBiasH.InsertValues(ehi, val); 116 YBias = true; 117 } 118 119 void G4SPSRandomGenerator::SetZBias(G4ThreeVector input) 120 { 121 G4double ehi, val; 122 ehi = input.x(); 123 val = input.y(); 124 ZBiasH.InsertValues(ehi, val); 125 ZBias = true; 126 } 127 128 void G4SPSRandomGenerator::SetThetaBias(G4ThreeVector input) 129 { 130 G4double ehi, val; 131 ehi = input.x(); 132 val = input.y(); 133 ThetaBiasH.InsertValues(ehi, val); 134 ThetaBias = true; 135 } 136 137 void G4SPSRandomGenerator::SetPhiBias(G4ThreeVector input) 138 { 139 G4double ehi, val; 140 ehi = input.x(); 141 val = input.y(); 142 PhiBiasH.InsertValues(ehi, val); 143 PhiBias = true; 144 } 145 146 void G4SPSRandomGenerator::SetEnergyBias(G4ThreeVector input) 147 { 148 G4double ehi, val; 149 ehi = input.x(); 150 val = input.y(); 151 EnergyBiasH.InsertValues(ehi, val); 152 EnergyBias = true; 153 } 154 155 void G4SPSRandomGenerator::SetPosThetaBias(G4ThreeVector input) 156 { 157 G4double ehi, val; 158 ehi = input.x(); 159 val = input.y(); 160 PosThetaBiasH.InsertValues(ehi, val); 161 PosThetaBias = true; 162 } 163 164 void G4SPSRandomGenerator::SetPosPhiBias(G4ThreeVector input) 165 { 166 G4double ehi, val; 167 ehi = input.x(); 168 val = input.y(); 169 PosPhiBiasH.InsertValues(ehi, val); 170 PosPhiBias = true; 171 } 172 173 void G4SPSRandomGenerator::ReSetHist(G4String atype) 174 { 175 if ( atype == "biasx") { 176 XBias = false ; 177 IPDFXBias = false; 178 XBiasH = IPDFXBiasH = ZeroPhysVector ;} 179 else if ( atype == "biasy") { 180 YBias = false ; 181 IPDFYBias = false; 182 YBiasH = IPDFYBiasH = ZeroPhysVector ;} 183 else if ( atype == "biasz") { 184 ZBias = false ; 185 IPDFZBias = false; 186 ZBiasH = IPDFZBiasH = ZeroPhysVector ;} 187 else if ( atype == "biast") { 188 ThetaBias = false ; 189 IPDFThetaBias = false; 190 ThetaBiasH = IPDFThetaBiasH = ZeroPhysVector ;} 191 else if ( atype == "biasp") { 192 PhiBias = false ; 193 IPDFPhiBias = false; 194 PhiBiasH = IPDFPhiBiasH = ZeroPhysVector ;} 195 else if ( atype == "biase") { 196 EnergyBias = false ; 197 IPDFEnergyBias = false; 198 EnergyBiasH = IPDFEnergyBiasH = ZeroPhysVector ;} 199 else if ( atype == "biaspt") { 200 PosThetaBias = false ; 201 IPDFPosThetaBias = false; 202 PosThetaBiasH = IPDFPosThetaBiasH = ZeroPhysVector ;} 203 else if ( atype == "biaspp") { 204 PosPhiBias = false ; 205 IPDFPosPhiBias = false; 206 PosPhiBiasH = IPDFPosPhiBiasH = ZeroPhysVector ;} 207 else { 208 G4cout << "Error, histtype not accepted " << G4endl; 209 } 210 } 211 212 G4double G4SPSRandomGenerator::GenRandX() 213 { 214 if(verbosityLevel >= 1) 215 G4cout << "In GenRandX" << G4endl; 216 if(XBias == false) 217 { 218 // X is not biased 219 G4double rndm = G4UniformRand(); 220 return(rndm); 221 } 222 else 223 { 224 // X is biased 225 if(IPDFXBias == false) 226 { 227 // IPDF has not been created, so create it 228 G4double bins[1024],vals[1024], sum; 229 G4int ii; 230 G4int maxbin = G4int(XBiasH.GetVectorLength()); 231 bins[0] = XBiasH.GetLowEdgeEnergy(size_t(0)); 232 vals[0] = XBiasH(size_t(0)); 233 sum = vals[0]; 234 for(ii=1;ii<maxbin;ii++) 235 { 236 bins[ii] = XBiasH.GetLowEdgeEnergy(size_t(ii)); 237 vals[ii] = XBiasH(size_t(ii)) + vals[ii-1]; 238 sum = sum + XBiasH(size_t(ii)); 239 } 240 241 for(ii=0;ii<maxbin;ii++) 242 { 243 vals[ii] = vals[ii]/sum; 244 IPDFXBiasH.InsertValues(bins[ii], vals[ii]); 245 } 246 // Make IPDFXBias = true 247 IPDFXBias = true; 248 } 249 // IPDF has been create so carry on 250 G4double rndm = G4UniformRand(); 251 252 // Calculate the weighting: Find the bin that the determined 253 // rndm is in and the weigthing will be the difference in the 254 // natural probability (from the x-axis) divided by the 255 // difference in the biased probability (the area). 256 size_t numberOfBin = IPDFXBiasH.GetVectorLength(); 257 G4int biasn1 = 0; 258 G4int biasn2 = numberOfBin/2; 259 G4int biasn3 = numberOfBin - 1; 260 while (biasn1 != biasn3 - 1) { 261 if (rndm > IPDFXBiasH(biasn2)) 262 biasn1 = biasn2; 263 else 264 biasn3 = biasn2; 265 biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; 266 } 267 // retrieve the areas and then the x-axis values 268 bweights[0] = IPDFXBiasH(biasn2) - IPDFXBiasH(biasn2 - 1); 269 G4double xaxisl = IPDFXBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); 270 G4double xaxisu = IPDFXBiasH.GetLowEdgeEnergy(size_t(biasn2)); 271 G4double NatProb = xaxisu - xaxisl; 272 //G4cout << "X Bin weight " << bweights[0] << " " << rndm << G4endl; 273 //G4cout << "lower and upper xaxis vals "<<xaxisl<<" "<<xaxisu<<G4endl; 274 bweights[0] = NatProb/bweights[0]; 275 if(verbosityLevel >= 1) 276 G4cout << "X bin weight " << bweights[0] << " " << rndm << G4endl; 277 return(IPDFXBiasH.GetEnergy(rndm)); 278 } 279 } 280 281 G4double G4SPSRandomGenerator::GenRandY() 282 { 283 if(verbosityLevel >= 1) 284 G4cout << "In GenRandY" << G4endl; 285 if(YBias == false) 286 { 287 // Y is not biased 288 G4double rndm = G4UniformRand(); 289 return(rndm); 290 } 291 else 292 { 293 // Y is biased 294 if(IPDFYBias == false) 295 { 296 // IPDF has not been created, so create it 297 G4double bins[1024],vals[1024], sum; 298 G4int ii; 299 G4int maxbin = G4int(YBiasH.GetVectorLength()); 300 bins[0] = YBiasH.GetLowEdgeEnergy(size_t(0)); 301 vals[0] = YBiasH(size_t(0)); 302 sum = vals[0]; 303 for(ii=1;ii<maxbin;ii++) 304 { 305 bins[ii] = YBiasH.GetLowEdgeEnergy(size_t(ii)); 306 vals[ii] = YBiasH(size_t(ii)) + vals[ii-1]; 307 sum = sum + YBiasH(size_t(ii)); 308 } 309 310 for(ii=0;ii<maxbin;ii++) 311 { 312 vals[ii] = vals[ii]/sum; 313 IPDFYBiasH.InsertValues(bins[ii], vals[ii]); 314 } 315 // Make IPDFYBias = true 316 IPDFYBias = true; 317 } 318 // IPDF has been create so carry on 319 G4double rndm = G4UniformRand(); 320 size_t numberOfBin = IPDFYBiasH.GetVectorLength(); 321 G4int biasn1 = 0; 322 G4int biasn2 = numberOfBin/2; 323 G4int biasn3 = numberOfBin - 1; 324 while (biasn1 != biasn3 - 1) { 325 if (rndm > IPDFYBiasH(biasn2)) 326 biasn1 = biasn2; 327 else 328 biasn3 = biasn2; 329 biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; 330 } 331 bweights[1] = IPDFYBiasH(biasn2) - IPDFYBiasH(biasn2 - 1); 332 G4double xaxisl = IPDFYBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); 333 G4double xaxisu = IPDFYBiasH.GetLowEdgeEnergy(size_t(biasn2)); 334 G4double NatProb = xaxisu - xaxisl; 335 bweights[1] = NatProb/bweights[1]; 336 if(verbosityLevel >= 1) 337 G4cout << "Y bin weight " << bweights[1] << " " << rndm << G4endl; 338 return(IPDFYBiasH.GetEnergy(rndm)); 339 } 340 } 341 342 G4double G4SPSRandomGenerator::GenRandZ() 343 { 344 if(verbosityLevel >= 1) 345 G4cout << "In GenRandZ" << G4endl; 346 if(ZBias == false) 347 { 348 // Z is not biased 349 G4double rndm = G4UniformRand(); 350 return(rndm); 351 } 352 else 353 { 354 // Z is biased 355 if(IPDFZBias == false) 356 { 357 // IPDF has not been created, so create it 358 G4double bins[1024],vals[1024], sum; 359 G4int ii; 360 G4int maxbin = G4int(ZBiasH.GetVectorLength()); 361 bins[0] = ZBiasH.GetLowEdgeEnergy(size_t(0)); 362 vals[0] = ZBiasH(size_t(0)); 363 sum = vals[0]; 364 for(ii=1;ii<maxbin;ii++) 365 { 366 bins[ii] = ZBiasH.GetLowEdgeEnergy(size_t(ii)); 367 vals[ii] = ZBiasH(size_t(ii)) + vals[ii-1]; 368 sum = sum + ZBiasH(size_t(ii)); 369 } 370 371 for(ii=0;ii<maxbin;ii++) 372 { 373 vals[ii] = vals[ii]/sum; 374 IPDFZBiasH.InsertValues(bins[ii], vals[ii]); 375 } 376 // Make IPDFZBias = true 377 IPDFZBias = true; 378 } 379 // IPDF has been create so carry on 380 G4double rndm = G4UniformRand(); 381 // size_t weight_bin_no = IPDFZBiasH.FindValueBinLocation(rndm); 382 size_t numberOfBin = IPDFZBiasH.GetVectorLength(); 383 G4int biasn1 = 0; 384 G4int biasn2 = numberOfBin/2; 385 G4int biasn3 = numberOfBin - 1; 386 while (biasn1 != biasn3 - 1) { 387 if (rndm > IPDFZBiasH(biasn2)) 388 biasn1 = biasn2; 389 else 390 biasn3 = biasn2; 391 biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; 392 } 393 bweights[2] = IPDFZBiasH(biasn2) - IPDFZBiasH(biasn2 - 1); 394 G4double xaxisl = IPDFZBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); 395 G4double xaxisu = IPDFZBiasH.GetLowEdgeEnergy(size_t(biasn2)); 396 G4double NatProb = xaxisu - xaxisl; 397 bweights[2] = NatProb/bweights[2]; 398 if(verbosityLevel >= 1) 399 G4cout << "Z bin weight " << bweights[2] << " " << rndm << G4endl; 400 return(IPDFZBiasH.GetEnergy(rndm)); 401 } 402 } 403 404 G4double G4SPSRandomGenerator::GenRandTheta() 405 { 406 if(verbosityLevel >= 1) 407 { 408 G4cout << "In GenRandTheta" << G4endl; 409 G4cout << "Verbosity " << verbosityLevel << G4endl; 410 } 411 if(ThetaBias == false) 412 { 413 // Theta is not biased 414 G4double rndm = G4UniformRand(); 415 return(rndm); 416 } 417 else 418 { 419 // Theta is biased 420 if(IPDFThetaBias == false) 421 { 422 // IPDF has not been created, so create it 423 G4double bins[1024],vals[1024], sum; 424 G4int ii; 425 G4int maxbin = G4int(ThetaBiasH.GetVectorLength()); 426 bins[0] = ThetaBiasH.GetLowEdgeEnergy(size_t(0)); 427 vals[0] = ThetaBiasH(size_t(0)); 428 sum = vals[0]; 429 for(ii=1;ii<maxbin;ii++) 430 { 431 bins[ii] = ThetaBiasH.GetLowEdgeEnergy(size_t(ii)); 432 vals[ii] = ThetaBiasH(size_t(ii)) + vals[ii-1]; 433 sum = sum + ThetaBiasH(size_t(ii)); 434 } 435 436 for(ii=0;ii<maxbin;ii++) 437 { 438 vals[ii] = vals[ii]/sum; 439 IPDFThetaBiasH.InsertValues(bins[ii], vals[ii]); 440 } 441 // Make IPDFThetaBias = true 442 IPDFThetaBias = true; 443 } 444 // IPDF has been create so carry on 445 G4double rndm = G4UniformRand(); 446 // size_t weight_bin_no = IPDFThetaBiasH.FindValueBinLocation(rndm); 447 size_t numberOfBin = IPDFThetaBiasH.GetVectorLength(); 448 G4int biasn1 = 0; 449 G4int biasn2 = numberOfBin/2; 450 G4int biasn3 = numberOfBin - 1; 451 while (biasn1 != biasn3 - 1) { 452 if (rndm > IPDFThetaBiasH(biasn2)) 453 biasn1 = biasn2; 454 else 455 biasn3 = biasn2; 456 biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; 457 } 458 bweights[3] = IPDFThetaBiasH(biasn2) - IPDFThetaBiasH(biasn2 - 1); 459 G4double xaxisl = IPDFThetaBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); 460 G4double xaxisu = IPDFThetaBiasH.GetLowEdgeEnergy(size_t(biasn2)); 461 G4double NatProb = xaxisu - xaxisl; 462 bweights[3] = NatProb/bweights[3]; 463 if(verbosityLevel >= 1) 464 G4cout << "Theta bin weight " << bweights[3] << " " << rndm << G4endl; 465 return(IPDFThetaBiasH.GetEnergy(rndm)); 466 } 467 } 468 469 G4double G4SPSRandomGenerator::GenRandPhi() 470 { 471 if(verbosityLevel >= 1) 472 G4cout << "In GenRandPhi" << G4endl; 473 if(PhiBias == false) 474 { 475 // Phi is not biased 476 G4double rndm = G4UniformRand(); 477 return(rndm); 478 } 479 else 480 { 481 // Phi is biased 482 if(IPDFPhiBias == false) 483 { 484 // IPDF has not been created, so create it 485 G4double bins[1024],vals[1024], sum; 486 G4int ii; 487 G4int maxbin = G4int(PhiBiasH.GetVectorLength()); 488 bins[0] = PhiBiasH.GetLowEdgeEnergy(size_t(0)); 489 vals[0] = PhiBiasH(size_t(0)); 490 sum = vals[0]; 491 for(ii=1;ii<maxbin;ii++) 492 { 493 bins[ii] = PhiBiasH.GetLowEdgeEnergy(size_t(ii)); 494 vals[ii] = PhiBiasH(size_t(ii)) + vals[ii-1]; 495 sum = sum + PhiBiasH(size_t(ii)); 496 } 497 498 for(ii=0;ii<maxbin;ii++) 499 { 500 vals[ii] = vals[ii]/sum; 501 IPDFPhiBiasH.InsertValues(bins[ii], vals[ii]); 502 } 503 // Make IPDFPhiBias = true 504 IPDFPhiBias = true; 505 } 506 // IPDF has been create so carry on 507 G4double rndm = G4UniformRand(); 508 // size_t weight_bin_no = IPDFPhiBiasH.FindValueBinLocation(rndm); 509 size_t numberOfBin = IPDFPhiBiasH.GetVectorLength(); 510 G4int biasn1 = 0; 511 G4int biasn2 = numberOfBin/2; 512 G4int biasn3 = numberOfBin - 1; 513 while (biasn1 != biasn3 - 1) { 514 if (rndm > IPDFPhiBiasH(biasn2)) 515 biasn1 = biasn2; 516 else 517 biasn3 = biasn2; 518 biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; 519 } 520 bweights[4] = IPDFPhiBiasH(biasn2) - IPDFPhiBiasH(biasn2 - 1); 521 G4double xaxisl = IPDFPhiBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); 522 G4double xaxisu = IPDFPhiBiasH.GetLowEdgeEnergy(size_t(biasn2)); 523 G4double NatProb = xaxisu - xaxisl; 524 bweights[4] = NatProb/bweights[4]; 525 if(verbosityLevel >= 1) 526 G4cout << "Phi bin weight " << bweights[4] << " " << rndm << G4endl; 527 return(IPDFPhiBiasH.GetEnergy(rndm)); 528 } 529 } 530 531 G4double G4SPSRandomGenerator::GenRandEnergy() 532 { 533 if(verbosityLevel >= 1) 534 G4cout << "In GenRandEnergy" << G4endl; 535 if(EnergyBias == false) 536 { 537 // Energy is not biased 538 G4double rndm = G4UniformRand(); 539 return(rndm); 540 } 541 else { 542 // ENERGY is biased 543 if(IPDFEnergyBias == false) { 544 // IPDF has not been created, so create it 545 G4double bins[1024],vals[1024], sum; 546 G4int ii; 547 G4int maxbin = G4int(EnergyBiasH.GetVectorLength()); 548 bins[0] = EnergyBiasH.GetLowEdgeEnergy(size_t(0)); 549 vals[0] = EnergyBiasH(size_t(0)); 550 sum = vals[0]; 551 for(ii=1;ii<maxbin;ii++) { 552 bins[ii] = EnergyBiasH.GetLowEdgeEnergy(size_t(ii)); 553 vals[ii] = EnergyBiasH(size_t(ii)) + vals[ii-1]; 554 sum = sum + EnergyBiasH(size_t(ii)); 555 } 556 557 for(ii=0;ii<maxbin;ii++) { 558 vals[ii] = vals[ii]/sum; 559 IPDFEnergyBiasH.InsertValues(bins[ii], vals[ii]); 560 } 561 // Make IPDFEnergyBias = true 562 IPDFEnergyBias = true; 563 } 564 // IPDF has been create so carry on 565 G4double rndm = G4UniformRand(); 566 // size_t weight_bin_no = IPDFEnergyBiasH.FindValueBinLocation(rndm); 567 size_t numberOfBin = IPDFEnergyBiasH.GetVectorLength(); 568 G4int biasn1 = 0; 569 G4int biasn2 = numberOfBin/2; 570 G4int biasn3 = numberOfBin - 1; 571 while (biasn1 != biasn3 - 1) { 572 if (rndm > IPDFEnergyBiasH(biasn2)) 573 biasn1 = biasn2; 574 else 575 biasn3 = biasn2; 576 biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; 577 } 578 bweights[5] = IPDFEnergyBiasH(biasn2) - IPDFEnergyBiasH(biasn2 - 1); 579 G4double xaxisl = IPDFEnergyBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); 580 G4double xaxisu = IPDFEnergyBiasH.GetLowEdgeEnergy(size_t(biasn2)); 581 G4double NatProb = xaxisu - xaxisl; 582 bweights[5] = NatProb/bweights[5]; 583 if(verbosityLevel >= 1) 584 G4cout << "Energy bin weight " << bweights[5] << " " << rndm << G4endl; 585 return(IPDFEnergyBiasH.GetEnergy(rndm)); 586 } 587 } 588 589 590 G4double G4SPSRandomGenerator::GenRandPosTheta() 591 { 592 if(verbosityLevel >= 1) 593 { 594 G4cout << "In GenRandPosTheta" << G4endl; 595 G4cout << "Verbosity " << verbosityLevel << G4endl; 596 } 597 if(PosThetaBias == false) 598 { 599 // Theta is not biased 600 G4double rndm = G4UniformRand(); 601 return(rndm); 602 } 603 else 604 { 605 // Theta is biased 606 if(IPDFPosThetaBias == false) 607 { 608 // IPDF has not been created, so create it 609 G4double bins[1024],vals[1024], sum; 610 G4int ii; 611 G4int maxbin = G4int(PosThetaBiasH.GetVectorLength()); 612 bins[0] = PosThetaBiasH.GetLowEdgeEnergy(size_t(0)); 613 vals[0] = PosThetaBiasH(size_t(0)); 614 sum = vals[0]; 615 for(ii=1;ii<maxbin;ii++) 616 { 617 bins[ii] = PosThetaBiasH.GetLowEdgeEnergy(size_t(ii)); 618 vals[ii] = PosThetaBiasH(size_t(ii)) + vals[ii-1]; 619 sum = sum + PosThetaBiasH(size_t(ii)); 620 } 621 622 for(ii=0;ii<maxbin;ii++) 623 { 624 vals[ii] = vals[ii]/sum; 625 IPDFPosThetaBiasH.InsertValues(bins[ii], vals[ii]); 626 } 627 // Make IPDFThetaBias = true 628 IPDFPosThetaBias = true; 629 } 630 // IPDF has been create so carry on 631 G4double rndm = G4UniformRand(); 632 // size_t weight_bin_no = IPDFThetaBiasH.FindValueBinLocation(rndm); 633 size_t numberOfBin = IPDFPosThetaBiasH.GetVectorLength(); 634 G4int biasn1 = 0; 635 G4int biasn2 = numberOfBin/2; 636 G4int biasn3 = numberOfBin - 1; 637 while (biasn1 != biasn3 - 1) { 638 if (rndm > IPDFPosThetaBiasH(biasn2)) 639 biasn1 = biasn2; 640 else 641 biasn3 = biasn2; 642 biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; 643 } 644 bweights[6] = IPDFPosThetaBiasH(biasn2) - IPDFPosThetaBiasH(biasn2 - 1); 645 G4double xaxisl = IPDFPosThetaBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); 646 G4double xaxisu = IPDFPosThetaBiasH.GetLowEdgeEnergy(size_t(biasn2)); 647 G4double NatProb = xaxisu - xaxisl; 648 bweights[6] = NatProb/bweights[6]; 649 if(verbosityLevel >= 1) 650 G4cout << "PosTheta bin weight " << bweights[6] << " " << rndm << G4endl; 651 return(IPDFPosThetaBiasH.GetEnergy(rndm)); 652 } 653 } 654 655 G4double G4SPSRandomGenerator::GenRandPosPhi() 656 { 657 if(verbosityLevel >= 1) 658 G4cout << "In GenRandPosPhi" << G4endl; 659 if(PosPhiBias == false) 660 { 661 // PosPhi is not biased 662 G4double rndm = G4UniformRand(); 663 return(rndm); 664 } 665 else 666 { 667 // PosPhi is biased 668 if(IPDFPosPhiBias == false) 669 { 670 // IPDF has not been created, so create it 671 G4double bins[1024],vals[1024], sum; 672 G4int ii; 673 G4int maxbin = G4int(PosPhiBiasH.GetVectorLength()); 674 bins[0] = PosPhiBiasH.GetLowEdgeEnergy(size_t(0)); 675 vals[0] = PosPhiBiasH(size_t(0)); 676 sum = vals[0]; 677 for(ii=1;ii<maxbin;ii++) 678 { 679 bins[ii] = PosPhiBiasH.GetLowEdgeEnergy(size_t(ii)); 680 vals[ii] = PosPhiBiasH(size_t(ii)) + vals[ii-1]; 681 sum = sum + PosPhiBiasH(size_t(ii)); 682 } 683 684 for(ii=0;ii<maxbin;ii++) 685 { 686 vals[ii] = vals[ii]/sum; 687 IPDFPosPhiBiasH.InsertValues(bins[ii], vals[ii]); 688 } 689 // Make IPDFPosPhiBias = true 690 IPDFPosPhiBias = true; 691 } 692 // IPDF has been create so carry on 693 G4double rndm = G4UniformRand(); 694 // size_t weight_bin_no = IPDFPosPhiBiasH.FindValueBinLocation(rndm); 695 size_t numberOfBin = IPDFPosPhiBiasH.GetVectorLength(); 696 G4int biasn1 = 0; 697 G4int biasn2 = numberOfBin/2; 698 G4int biasn3 = numberOfBin - 1; 699 while (biasn1 != biasn3 - 1) { 700 if (rndm > IPDFPosPhiBiasH(biasn2)) 701 biasn1 = biasn2; 702 else 703 biasn3 = biasn2; 704 biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; 705 } 706 bweights[7] = IPDFPosPhiBiasH(biasn2) - IPDFPosPhiBiasH(biasn2 - 1); 707 G4double xaxisl = IPDFPosPhiBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); 708 G4double xaxisu = IPDFPosPhiBiasH.GetLowEdgeEnergy(size_t(biasn2)); 709 G4double NatProb = xaxisu - xaxisl; 710 bweights[7] = NatProb/bweights[7]; 711 if(verbosityLevel >= 1) 712 G4cout << "PosPhi bin weight " << bweights[7] << " " << rndm << G4endl; 713 return(IPDFPosPhiBiasH.GetEnergy(rndm)); 714 } 715 } 716 717 718 719 720 101 void G4SPSRandomGenerator::SetXBias(G4ThreeVector input) { 102 G4double ehi, val; 103 ehi = input.x(); 104 val = input.y(); 105 XBiasH.InsertValues(ehi, val); 106 XBias = true; 107 } 108 109 void G4SPSRandomGenerator::SetYBias(G4ThreeVector input) { 110 G4double ehi, val; 111 ehi = input.x(); 112 val = input.y(); 113 YBiasH.InsertValues(ehi, val); 114 YBias = true; 115 } 116 117 void G4SPSRandomGenerator::SetZBias(G4ThreeVector input) { 118 G4double ehi, val; 119 ehi = input.x(); 120 val = input.y(); 121 ZBiasH.InsertValues(ehi, val); 122 ZBias = true; 123 } 124 125 void G4SPSRandomGenerator::SetThetaBias(G4ThreeVector input) { 126 G4double ehi, val; 127 ehi = input.x(); 128 val = input.y(); 129 ThetaBiasH.InsertValues(ehi, val); 130 ThetaBias = true; 131 } 132 133 void G4SPSRandomGenerator::SetPhiBias(G4ThreeVector input) { 134 G4double ehi, val; 135 ehi = input.x(); 136 val = input.y(); 137 PhiBiasH.InsertValues(ehi, val); 138 PhiBias = true; 139 } 140 141 void G4SPSRandomGenerator::SetEnergyBias(G4ThreeVector input) { 142 G4double ehi, val; 143 ehi = input.x(); 144 val = input.y(); 145 EnergyBiasH.InsertValues(ehi, val); 146 EnergyBias = true; 147 } 148 149 void G4SPSRandomGenerator::SetPosThetaBias(G4ThreeVector input) { 150 G4double ehi, val; 151 ehi = input.x(); 152 val = input.y(); 153 PosThetaBiasH.InsertValues(ehi, val); 154 PosThetaBias = true; 155 } 156 157 void G4SPSRandomGenerator::SetPosPhiBias(G4ThreeVector input) { 158 G4double ehi, val; 159 ehi = input.x(); 160 val = input.y(); 161 PosPhiBiasH.InsertValues(ehi, val); 162 PosPhiBias = true; 163 } 164 165 void G4SPSRandomGenerator::ReSetHist(G4String atype) { 166 if (atype == "biasx") { 167 XBias = false; 168 IPDFXBias = false; 169 XBiasH = IPDFXBiasH = ZeroPhysVector; 170 } else if (atype == "biasy") { 171 YBias = false; 172 IPDFYBias = false; 173 YBiasH = IPDFYBiasH = ZeroPhysVector; 174 } else if (atype == "biasz") { 175 ZBias = false; 176 IPDFZBias = false; 177 ZBiasH = IPDFZBiasH = ZeroPhysVector; 178 } else if (atype == "biast") { 179 ThetaBias = false; 180 IPDFThetaBias = false; 181 ThetaBiasH = IPDFThetaBiasH = ZeroPhysVector; 182 } else if (atype == "biasp") { 183 PhiBias = false; 184 IPDFPhiBias = false; 185 PhiBiasH = IPDFPhiBiasH = ZeroPhysVector; 186 } else if (atype == "biase") { 187 EnergyBias = false; 188 IPDFEnergyBias = false; 189 EnergyBiasH = IPDFEnergyBiasH = ZeroPhysVector; 190 } else if (atype == "biaspt") { 191 PosThetaBias = false; 192 IPDFPosThetaBias = false; 193 PosThetaBiasH = IPDFPosThetaBiasH = ZeroPhysVector; 194 } else if (atype == "biaspp") { 195 PosPhiBias = false; 196 IPDFPosPhiBias = false; 197 PosPhiBiasH = IPDFPosPhiBiasH = ZeroPhysVector; 198 } else { 199 G4cout << "Error, histtype not accepted " << G4endl; 200 } 201 } 202 203 G4double G4SPSRandomGenerator::GenRandX() { 204 if (verbosityLevel >= 1) 205 G4cout << "In GenRandX" << G4endl; 206 if (XBias == false) { 207 // X is not biased 208 G4double rndm = G4UniformRand(); 209 return (rndm); 210 } else { 211 // X is biased 212 if (IPDFXBias == false) { 213 // IPDF has not been created, so create it 214 G4double bins[1024], vals[1024], sum; 215 G4int ii; 216 G4int maxbin = G4int(XBiasH.GetVectorLength()); 217 bins[0] = XBiasH.GetLowEdgeEnergy(size_t(0)); 218 vals[0] = XBiasH(size_t(0)); 219 sum = vals[0]; 220 for (ii = 1; ii < maxbin; ii++) { 221 bins[ii] = XBiasH.GetLowEdgeEnergy(size_t(ii)); 222 vals[ii] = XBiasH(size_t(ii)) + vals[ii - 1]; 223 sum = sum + XBiasH(size_t(ii)); 224 } 225 226 for (ii = 0; ii < maxbin; ii++) { 227 vals[ii] = vals[ii] / sum; 228 IPDFXBiasH.InsertValues(bins[ii], vals[ii]); 229 } 230 // Make IPDFXBias = true 231 IPDFXBias = true; 232 } 233 // IPDF has been create so carry on 234 G4double rndm = G4UniformRand(); 235 236 // Calculate the weighting: Find the bin that the determined 237 // rndm is in and the weigthing will be the difference in the 238 // natural probability (from the x-axis) divided by the 239 // difference in the biased probability (the area). 240 size_t numberOfBin = IPDFXBiasH.GetVectorLength(); 241 G4int biasn1 = 0; 242 G4int biasn2 = numberOfBin / 2; 243 G4int biasn3 = numberOfBin - 1; 244 while (biasn1 != biasn3 - 1) { 245 if (rndm > IPDFXBiasH(biasn2)) 246 biasn1 = biasn2; 247 else 248 biasn3 = biasn2; 249 biasn2 = biasn1 + (biasn3 - biasn1 + 1) / 2; 250 } 251 // retrieve the areas and then the x-axis values 252 bweights[0] = IPDFXBiasH(biasn2) - IPDFXBiasH(biasn2 - 1); 253 G4double xaxisl = IPDFXBiasH.GetLowEdgeEnergy(size_t(biasn2 - 1)); 254 G4double xaxisu = IPDFXBiasH.GetLowEdgeEnergy(size_t(biasn2)); 255 G4double NatProb = xaxisu - xaxisl; 256 //G4cout << "X Bin weight " << bweights[0] << " " << rndm << G4endl; 257 //G4cout << "lower and upper xaxis vals "<<xaxisl<<" "<<xaxisu<<G4endl; 258 bweights[0] = NatProb / bweights[0]; 259 if (verbosityLevel >= 1) 260 G4cout << "X bin weight " << bweights[0] << " " << rndm << G4endl; 261 return (IPDFXBiasH.GetEnergy(rndm)); 262 } 263 } 264 265 G4double G4SPSRandomGenerator::GenRandY() { 266 if (verbosityLevel >= 1) 267 G4cout << "In GenRandY" << G4endl; 268 if (YBias == false) { 269 // Y is not biased 270 G4double rndm = G4UniformRand(); 271 return (rndm); 272 } else { 273 // Y is biased 274 if (IPDFYBias == false) { 275 // IPDF has not been created, so create it 276 G4double bins[1024], vals[1024], sum; 277 G4int ii; 278 G4int maxbin = G4int(YBiasH.GetVectorLength()); 279 bins[0] = YBiasH.GetLowEdgeEnergy(size_t(0)); 280 vals[0] = YBiasH(size_t(0)); 281 sum = vals[0]; 282 for (ii = 1; ii < maxbin; ii++) { 283 bins[ii] = YBiasH.GetLowEdgeEnergy(size_t(ii)); 284 vals[ii] = YBiasH(size_t(ii)) + vals[ii - 1]; 285 sum = sum + YBiasH(size_t(ii)); 286 } 287 288 for (ii = 0; ii < maxbin; ii++) { 289 vals[ii] = vals[ii] / sum; 290 IPDFYBiasH.InsertValues(bins[ii], vals[ii]); 291 } 292 // Make IPDFYBias = true 293 IPDFYBias = true; 294 } 295 // IPDF has been create so carry on 296 G4double rndm = G4UniformRand(); 297 size_t numberOfBin = IPDFYBiasH.GetVectorLength(); 298 G4int biasn1 = 0; 299 G4int biasn2 = numberOfBin / 2; 300 G4int biasn3 = numberOfBin - 1; 301 while (biasn1 != biasn3 - 1) { 302 if (rndm > IPDFYBiasH(biasn2)) 303 biasn1 = biasn2; 304 else 305 biasn3 = biasn2; 306 biasn2 = biasn1 + (biasn3 - biasn1 + 1) / 2; 307 } 308 bweights[1] = IPDFYBiasH(biasn2) - IPDFYBiasH(biasn2 - 1); 309 G4double xaxisl = IPDFYBiasH.GetLowEdgeEnergy(size_t(biasn2 - 1)); 310 G4double xaxisu = IPDFYBiasH.GetLowEdgeEnergy(size_t(biasn2)); 311 G4double NatProb = xaxisu - xaxisl; 312 bweights[1] = NatProb / bweights[1]; 313 if (verbosityLevel >= 1) 314 G4cout << "Y bin weight " << bweights[1] << " " << rndm << G4endl; 315 return (IPDFYBiasH.GetEnergy(rndm)); 316 } 317 } 318 319 G4double G4SPSRandomGenerator::GenRandZ() { 320 if (verbosityLevel >= 1) 321 G4cout << "In GenRandZ" << G4endl; 322 if (ZBias == false) { 323 // Z is not biased 324 G4double rndm = G4UniformRand(); 325 return (rndm); 326 } else { 327 // Z is biased 328 if (IPDFZBias == false) { 329 // IPDF has not been created, so create it 330 G4double bins[1024], vals[1024], sum; 331 G4int ii; 332 G4int maxbin = G4int(ZBiasH.GetVectorLength()); 333 bins[0] = ZBiasH.GetLowEdgeEnergy(size_t(0)); 334 vals[0] = ZBiasH(size_t(0)); 335 sum = vals[0]; 336 for (ii = 1; ii < maxbin; ii++) { 337 bins[ii] = ZBiasH.GetLowEdgeEnergy(size_t(ii)); 338 vals[ii] = ZBiasH(size_t(ii)) + vals[ii - 1]; 339 sum = sum + ZBiasH(size_t(ii)); 340 } 341 342 for (ii = 0; ii < maxbin; ii++) { 343 vals[ii] = vals[ii] / sum; 344 IPDFZBiasH.InsertValues(bins[ii], vals[ii]); 345 } 346 // Make IPDFZBias = true 347 IPDFZBias = true; 348 } 349 // IPDF has been create so carry on 350 G4double rndm = G4UniformRand(); 351 // size_t weight_bin_no = IPDFZBiasH.FindValueBinLocation(rndm); 352 size_t numberOfBin = IPDFZBiasH.GetVectorLength(); 353 G4int biasn1 = 0; 354 G4int biasn2 = numberOfBin / 2; 355 G4int biasn3 = numberOfBin - 1; 356 while (biasn1 != biasn3 - 1) { 357 if (rndm > IPDFZBiasH(biasn2)) 358 biasn1 = biasn2; 359 else 360 biasn3 = biasn2; 361 biasn2 = biasn1 + (biasn3 - biasn1 + 1) / 2; 362 } 363 bweights[2] = IPDFZBiasH(biasn2) - IPDFZBiasH(biasn2 - 1); 364 G4double xaxisl = IPDFZBiasH.GetLowEdgeEnergy(size_t(biasn2 - 1)); 365 G4double xaxisu = IPDFZBiasH.GetLowEdgeEnergy(size_t(biasn2)); 366 G4double NatProb = xaxisu - xaxisl; 367 bweights[2] = NatProb / bweights[2]; 368 if (verbosityLevel >= 1) 369 G4cout << "Z bin weight " << bweights[2] << " " << rndm << G4endl; 370 return (IPDFZBiasH.GetEnergy(rndm)); 371 } 372 } 373 374 G4double G4SPSRandomGenerator::GenRandTheta() { 375 if (verbosityLevel >= 1) { 376 G4cout << "In GenRandTheta" << G4endl; 377 G4cout << "Verbosity " << verbosityLevel << G4endl; 378 } 379 if (ThetaBias == false) { 380 // Theta is not biased 381 G4double rndm = G4UniformRand(); 382 return (rndm); 383 } else { 384 // Theta is biased 385 if (IPDFThetaBias == false) { 386 // IPDF has not been created, so create it 387 G4double bins[1024], vals[1024], sum; 388 G4int ii; 389 G4int maxbin = G4int(ThetaBiasH.GetVectorLength()); 390 bins[0] = ThetaBiasH.GetLowEdgeEnergy(size_t(0)); 391 vals[0] = ThetaBiasH(size_t(0)); 392 sum = vals[0]; 393 for (ii = 1; ii < maxbin; ii++) { 394 bins[ii] = ThetaBiasH.GetLowEdgeEnergy(size_t(ii)); 395 vals[ii] = ThetaBiasH(size_t(ii)) + vals[ii - 1]; 396 sum = sum + ThetaBiasH(size_t(ii)); 397 } 398 399 for (ii = 0; ii < maxbin; ii++) { 400 vals[ii] = vals[ii] / sum; 401 IPDFThetaBiasH.InsertValues(bins[ii], vals[ii]); 402 } 403 // Make IPDFThetaBias = true 404 IPDFThetaBias = true; 405 } 406 // IPDF has been create so carry on 407 G4double rndm = G4UniformRand(); 408 // size_t weight_bin_no = IPDFThetaBiasH.FindValueBinLocation(rndm); 409 size_t numberOfBin = IPDFThetaBiasH.GetVectorLength(); 410 G4int biasn1 = 0; 411 G4int biasn2 = numberOfBin / 2; 412 G4int biasn3 = numberOfBin - 1; 413 while (biasn1 != biasn3 - 1) { 414 if (rndm > IPDFThetaBiasH(biasn2)) 415 biasn1 = biasn2; 416 else 417 biasn3 = biasn2; 418 biasn2 = biasn1 + (biasn3 - biasn1 + 1) / 2; 419 } 420 bweights[3] = IPDFThetaBiasH(biasn2) - IPDFThetaBiasH(biasn2 - 1); 421 G4double xaxisl = IPDFThetaBiasH.GetLowEdgeEnergy(size_t(biasn2 - 1)); 422 G4double xaxisu = IPDFThetaBiasH.GetLowEdgeEnergy(size_t(biasn2)); 423 G4double NatProb = xaxisu - xaxisl; 424 bweights[3] = NatProb / bweights[3]; 425 if (verbosityLevel >= 1) 426 G4cout << "Theta bin weight " << bweights[3] << " " << rndm 427 << G4endl; 428 return (IPDFThetaBiasH.GetEnergy(rndm)); 429 } 430 } 431 432 G4double G4SPSRandomGenerator::GenRandPhi() { 433 if (verbosityLevel >= 1) 434 G4cout << "In GenRandPhi" << G4endl; 435 if (PhiBias == false) { 436 // Phi is not biased 437 G4double rndm = G4UniformRand(); 438 return (rndm); 439 } else { 440 // Phi is biased 441 if (IPDFPhiBias == false) { 442 // IPDF has not been created, so create it 443 G4double bins[1024], vals[1024], sum; 444 G4int ii; 445 G4int maxbin = G4int(PhiBiasH.GetVectorLength()); 446 bins[0] = PhiBiasH.GetLowEdgeEnergy(size_t(0)); 447 vals[0] = PhiBiasH(size_t(0)); 448 sum = vals[0]; 449 for (ii = 1; ii < maxbin; ii++) { 450 bins[ii] = PhiBiasH.GetLowEdgeEnergy(size_t(ii)); 451 vals[ii] = PhiBiasH(size_t(ii)) + vals[ii - 1]; 452 sum = sum + PhiBiasH(size_t(ii)); 453 } 454 455 for (ii = 0; ii < maxbin; ii++) { 456 vals[ii] = vals[ii] / sum; 457 IPDFPhiBiasH.InsertValues(bins[ii], vals[ii]); 458 } 459 // Make IPDFPhiBias = true 460 IPDFPhiBias = true; 461 } 462 // IPDF has been create so carry on 463 G4double rndm = G4UniformRand(); 464 // size_t weight_bin_no = IPDFPhiBiasH.FindValueBinLocation(rndm); 465 size_t numberOfBin = IPDFPhiBiasH.GetVectorLength(); 466 G4int biasn1 = 0; 467 G4int biasn2 = numberOfBin / 2; 468 G4int biasn3 = numberOfBin - 1; 469 while (biasn1 != biasn3 - 1) { 470 if (rndm > IPDFPhiBiasH(biasn2)) 471 biasn1 = biasn2; 472 else 473 biasn3 = biasn2; 474 biasn2 = biasn1 + (biasn3 - biasn1 + 1) / 2; 475 } 476 bweights[4] = IPDFPhiBiasH(biasn2) - IPDFPhiBiasH(biasn2 - 1); 477 G4double xaxisl = IPDFPhiBiasH.GetLowEdgeEnergy(size_t(biasn2 - 1)); 478 G4double xaxisu = IPDFPhiBiasH.GetLowEdgeEnergy(size_t(biasn2)); 479 G4double NatProb = xaxisu - xaxisl; 480 bweights[4] = NatProb / bweights[4]; 481 if (verbosityLevel >= 1) 482 G4cout << "Phi bin weight " << bweights[4] << " " << rndm << G4endl; 483 return (IPDFPhiBiasH.GetEnergy(rndm)); 484 } 485 } 486 487 G4double G4SPSRandomGenerator::GenRandEnergy() { 488 if (verbosityLevel >= 1) 489 G4cout << "In GenRandEnergy" << G4endl; 490 if (EnergyBias == false) { 491 // Energy is not biased 492 G4double rndm = G4UniformRand(); 493 return (rndm); 494 } else { 495 // ENERGY is biased 496 if (IPDFEnergyBias == false) { 497 // IPDF has not been created, so create it 498 G4double bins[1024], vals[1024], sum; 499 G4int ii; 500 G4int maxbin = G4int(EnergyBiasH.GetVectorLength()); 501 bins[0] = EnergyBiasH.GetLowEdgeEnergy(size_t(0)); 502 vals[0] = EnergyBiasH(size_t(0)); 503 sum = vals[0]; 504 for (ii = 1; ii < maxbin; ii++) { 505 bins[ii] = EnergyBiasH.GetLowEdgeEnergy(size_t(ii)); 506 vals[ii] = EnergyBiasH(size_t(ii)) + vals[ii - 1]; 507 sum = sum + EnergyBiasH(size_t(ii)); 508 } 509 IPDFEnergyBiasH = ZeroPhysVector; 510 for (ii = 0; ii < maxbin; ii++) { 511 vals[ii] = vals[ii] / sum; 512 IPDFEnergyBiasH.InsertValues(bins[ii], vals[ii]); 513 } 514 // Make IPDFEnergyBias = true 515 IPDFEnergyBias = true; 516 } 517 // IPDF has been create so carry on 518 G4double rndm = G4UniformRand(); 519 // size_t weight_bin_no = IPDFEnergyBiasH.FindValueBinLocation(rndm); 520 size_t numberOfBin = IPDFEnergyBiasH.GetVectorLength(); 521 G4int biasn1 = 0; 522 G4int biasn2 = numberOfBin / 2; 523 G4int biasn3 = numberOfBin - 1; 524 while (biasn1 != biasn3 - 1) { 525 if (rndm > IPDFEnergyBiasH(biasn2)) 526 biasn1 = biasn2; 527 else 528 biasn3 = biasn2; 529 biasn2 = biasn1 + (biasn3 - biasn1 + 1) / 2; 530 } 531 bweights[5] = IPDFEnergyBiasH(biasn2) - IPDFEnergyBiasH(biasn2 - 1); 532 G4double xaxisl = IPDFEnergyBiasH.GetLowEdgeEnergy(size_t(biasn2 - 1)); 533 G4double xaxisu = IPDFEnergyBiasH.GetLowEdgeEnergy(size_t(biasn2)); 534 G4double NatProb = xaxisu - xaxisl; 535 bweights[5] = NatProb / bweights[5]; 536 if (verbosityLevel >= 1) 537 G4cout << "Energy bin weight " << bweights[5] << " " << rndm 538 << G4endl; 539 return (IPDFEnergyBiasH.GetEnergy(rndm)); 540 } 541 } 542 543 G4double G4SPSRandomGenerator::GenRandPosTheta() { 544 if (verbosityLevel >= 1) { 545 G4cout << "In GenRandPosTheta" << G4endl; 546 G4cout << "Verbosity " << verbosityLevel << G4endl; 547 } 548 if (PosThetaBias == false) { 549 // Theta is not biased 550 G4double rndm = G4UniformRand(); 551 return (rndm); 552 } else { 553 // Theta is biased 554 if (IPDFPosThetaBias == false) { 555 // IPDF has not been created, so create it 556 G4double bins[1024], vals[1024], sum; 557 G4int ii; 558 G4int maxbin = G4int(PosThetaBiasH.GetVectorLength()); 559 bins[0] = PosThetaBiasH.GetLowEdgeEnergy(size_t(0)); 560 vals[0] = PosThetaBiasH(size_t(0)); 561 sum = vals[0]; 562 for (ii = 1; ii < maxbin; ii++) { 563 bins[ii] = PosThetaBiasH.GetLowEdgeEnergy(size_t(ii)); 564 vals[ii] = PosThetaBiasH(size_t(ii)) + vals[ii - 1]; 565 sum = sum + PosThetaBiasH(size_t(ii)); 566 } 567 568 for (ii = 0; ii < maxbin; ii++) { 569 vals[ii] = vals[ii] / sum; 570 IPDFPosThetaBiasH.InsertValues(bins[ii], vals[ii]); 571 } 572 // Make IPDFThetaBias = true 573 IPDFPosThetaBias = true; 574 } 575 // IPDF has been create so carry on 576 G4double rndm = G4UniformRand(); 577 // size_t weight_bin_no = IPDFThetaBiasH.FindValueBinLocation(rndm); 578 size_t numberOfBin = IPDFPosThetaBiasH.GetVectorLength(); 579 G4int biasn1 = 0; 580 G4int biasn2 = numberOfBin / 2; 581 G4int biasn3 = numberOfBin - 1; 582 while (biasn1 != biasn3 - 1) { 583 if (rndm > IPDFPosThetaBiasH(biasn2)) 584 biasn1 = biasn2; 585 else 586 biasn3 = biasn2; 587 biasn2 = biasn1 + (biasn3 - biasn1 + 1) / 2; 588 } 589 bweights[6] = IPDFPosThetaBiasH(biasn2) - IPDFPosThetaBiasH(biasn2 - 1); 590 G4double xaxisl = 591 IPDFPosThetaBiasH.GetLowEdgeEnergy(size_t(biasn2 - 1)); 592 G4double xaxisu = IPDFPosThetaBiasH.GetLowEdgeEnergy(size_t(biasn2)); 593 G4double NatProb = xaxisu - xaxisl; 594 bweights[6] = NatProb / bweights[6]; 595 if (verbosityLevel >= 1) 596 G4cout << "PosTheta bin weight " << bweights[6] << " " << rndm 597 << G4endl; 598 return (IPDFPosThetaBiasH.GetEnergy(rndm)); 599 } 600 } 601 602 G4double G4SPSRandomGenerator::GenRandPosPhi() { 603 if (verbosityLevel >= 1) 604 G4cout << "In GenRandPosPhi" << G4endl; 605 if (PosPhiBias == false) { 606 // PosPhi is not biased 607 G4double rndm = G4UniformRand(); 608 return (rndm); 609 } else { 610 // PosPhi is biased 611 if (IPDFPosPhiBias == false) { 612 // IPDF has not been created, so create it 613 G4double bins[1024], vals[1024], sum; 614 G4int ii; 615 G4int maxbin = G4int(PosPhiBiasH.GetVectorLength()); 616 bins[0] = PosPhiBiasH.GetLowEdgeEnergy(size_t(0)); 617 vals[0] = PosPhiBiasH(size_t(0)); 618 sum = vals[0]; 619 for (ii = 1; ii < maxbin; ii++) { 620 bins[ii] = PosPhiBiasH.GetLowEdgeEnergy(size_t(ii)); 621 vals[ii] = PosPhiBiasH(size_t(ii)) + vals[ii - 1]; 622 sum = sum + PosPhiBiasH(size_t(ii)); 623 } 624 625 for (ii = 0; ii < maxbin; ii++) { 626 vals[ii] = vals[ii] / sum; 627 IPDFPosPhiBiasH.InsertValues(bins[ii], vals[ii]); 628 } 629 // Make IPDFPosPhiBias = true 630 IPDFPosPhiBias = true; 631 } 632 // IPDF has been create so carry on 633 G4double rndm = G4UniformRand(); 634 // size_t weight_bin_no = IPDFPosPhiBiasH.FindValueBinLocation(rndm); 635 size_t numberOfBin = IPDFPosPhiBiasH.GetVectorLength(); 636 G4int biasn1 = 0; 637 G4int biasn2 = numberOfBin / 2; 638 G4int biasn3 = numberOfBin - 1; 639 while (biasn1 != biasn3 - 1) { 640 if (rndm > IPDFPosPhiBiasH(biasn2)) 641 biasn1 = biasn2; 642 else 643 biasn3 = biasn2; 644 biasn2 = biasn1 + (biasn3 - biasn1 + 1) / 2; 645 } 646 bweights[7] = IPDFPosPhiBiasH(biasn2) - IPDFPosPhiBiasH(biasn2 - 1); 647 G4double xaxisl = IPDFPosPhiBiasH.GetLowEdgeEnergy(size_t(biasn2 - 1)); 648 G4double xaxisu = IPDFPosPhiBiasH.GetLowEdgeEnergy(size_t(biasn2)); 649 G4double NatProb = xaxisu - xaxisl; 650 bweights[7] = NatProb / bweights[7]; 651 if (verbosityLevel >= 1) 652 G4cout << "PosPhi bin weight " << bweights[7] << " " << rndm 653 << G4endl; 654 return (IPDFPosPhiBiasH.GetEnergy(rndm)); 655 } 656 } 657
Note: See TracChangeset
for help on using the changeset viewer.