Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/event/src/G4SPSRandomGenerator.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /event/src/G4SPSRandomGenerator.cc (Version 11.3.0) and /event/src/G4SPSRandomGenerator.cc (Version 3.0)


  1 //                                                  1 
  2 // *******************************************    
  3 // * License and Disclaimer                       
  4 // *                                              
  5 // * The  Geant4 software  is  copyright of th    
  6 // * the Geant4 Collaboration.  It is provided    
  7 // * conditions of the Geant4 Software License    
  8 // * LICENSE and available at  http://cern.ch/    
  9 // * include a list of copyright holders.         
 10 // *                                              
 11 // * Neither the authors of this software syst    
 12 // * institutes,nor the agencies providing fin    
 13 // * work  make  any representation or  warran    
 14 // * regarding  this  software system or assum    
 15 // * use.  Please see the license in the file     
 16 // * for the full disclaimer and the limitatio    
 17 // *                                              
 18 // * This  code  implementation is the result     
 19 // * technical work of the GEANT4 collaboratio    
 20 // * By using,  copying,  modifying or  distri    
 21 // * any work based  on the software)  you  ag    
 22 // * use  in  resulting  scientific  publicati    
 23 // * acceptance of all terms of the Geant4 Sof    
 24 // *******************************************    
 25 //                                                
 26 // G4SPSRandomGenerator class implementation      
 27 //                                                
 28 // Author: Fan Lei, QinetiQ ltd. - 05/02/2004     
 29 // Customer: ESA/ESTEC                            
 30 // Revision: Andrea Dotti, SLAC                   
 31 // -------------------------------------------    
 32                                                   
 33 #include <cmath>                                  
 34                                                   
 35 #include "G4PrimaryParticle.hh"                   
 36 #include "G4Event.hh"                             
 37 #include "Randomize.hh"                           
 38 #include "G4TransportationManager.hh"             
 39 #include "G4VPhysicalVolume.hh"                   
 40 #include "G4PhysicalVolumeStore.hh"               
 41 #include "G4ParticleTable.hh"                     
 42 #include "G4ParticleDefinition.hh"                
 43 #include "G4IonTable.hh"                          
 44 #include "G4Ions.hh"                              
 45 #include "G4TrackingManager.hh"                   
 46 #include "G4Track.hh"                             
 47 #include "G4AutoLock.hh"                          
 48                                                   
 49 #include "G4SPSRandomGenerator.hh"                
 50                                                   
 51 G4SPSRandomGenerator::bweights_t::bweights_t()    
 52 {                                                 
 53   for (double & i : w)  { i = 1; }                
 54 }                                                 
 55                                                   
 56 G4double& G4SPSRandomGenerator::bweights_t::op    
 57 {                                                 
 58   return w[i];                                    
 59 }                                                 
 60                                                   
 61 G4SPSRandomGenerator::G4SPSRandomGenerator()      
 62 {                                                 
 63   // Initialise all variables                     
 64                                                   
 65   // Bias variables                               
 66   //                                              
 67   XBias = false;                                  
 68   IPDFXBias = false;                              
 69   YBias = false;                                  
 70   IPDFYBias = false;                              
 71   ZBias = false;                                  
 72   IPDFZBias = false;                              
 73   ThetaBias = false;                              
 74   IPDFThetaBias = false;                          
 75   PhiBias = false;                                
 76   IPDFPhiBias = false;                            
 77   EnergyBias = false;                             
 78   IPDFEnergyBias = false;                         
 79   PosThetaBias = false;                           
 80   IPDFPosThetaBias = false;                       
 81   PosPhiBias = false;                             
 82   IPDFPosPhiBias = false;                         
 83                                                   
 84   verbosityLevel = 0;                             
 85   G4MUTEXINIT(mutex);                             
 86 }                                                 
 87                                                   
 88 G4SPSRandomGenerator::~G4SPSRandomGenerator()     
 89 {                                                 
 90   G4MUTEXDESTROY(mutex);                          
 91 }                                                 
 92                                                   
 93 // Biasing methods                                
 94                                                   
 95 void G4SPSRandomGenerator::SetXBias(const G4Th    
 96 {                                                 
 97   G4AutoLock l(&mutex);                           
 98   G4double ehi, val;                              
 99   ehi = input.x();                                
100   val = input.y();                                
101   XBiasH.InsertValues(ehi, val);                  
102   XBias = true;                                   
103 }                                                 
104                                                   
105 void G4SPSRandomGenerator::SetYBias(const G4Th    
106 {                                                 
107   G4AutoLock l(&mutex);                           
108   G4double ehi, val;                              
109   ehi = input.x();                                
110   val = input.y();                                
111   YBiasH.InsertValues(ehi, val);                  
112   YBias = true;                                   
113 }                                                 
114                                                   
115 void G4SPSRandomGenerator::SetZBias(const G4Th    
116 {                                                 
117   G4AutoLock l(&mutex);                           
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(const     
126 {                                                 
127   G4AutoLock l(&mutex);                           
128   G4double ehi, val;                              
129   ehi = input.x();                                
130   val = input.y();                                
131   ThetaBiasH.InsertValues(ehi, val);              
132   ThetaBias = true;                               
133 }                                                 
134                                                   
135 void G4SPSRandomGenerator::SetPhiBias(const G4    
136 {                                                 
137   G4AutoLock l(&mutex);                           
138   G4double ehi, val;                              
139   ehi = input.x();                                
140   val = input.y();                                
141   PhiBiasH.InsertValues(ehi, val);                
142   PhiBias = true;                                 
143 }                                                 
144                                                   
145 void G4SPSRandomGenerator::SetEnergyBias(const    
146 {                                                 
147   G4AutoLock l(&mutex);                           
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(con    
156 {                                                 
157   G4AutoLock l(&mutex);                           
158   G4double ehi, val;                              
159   ehi = input.x();                                
160   val = input.y();                                
161   PosThetaBiasH.InsertValues(ehi, val);           
162   PosThetaBias = true;                            
163 }                                                 
164                                                   
165 void G4SPSRandomGenerator::SetPosPhiBias(const    
166 {                                                 
167   G4AutoLock l(&mutex);                           
168   G4double ehi, val;                              
169   ehi = input.x();                                
170   val = input.y();                                
171   PosPhiBiasH.InsertValues(ehi, val);             
172   PosPhiBias = true;                              
173 }                                                 
174                                                   
175 void G4SPSRandomGenerator::SetIntensityWeight(    
176 {                                                 
177   bweights.Get()[8] = weight;                     
178 }                                                 
179                                                   
180 G4double G4SPSRandomGenerator::GetBiasWeight()    
181 {                                                 
182   bweights_t& w = bweights.Get();                 
183   return w[0] * w[1] * w[2] * w[3] * w[4] * w[    
184 }                                                 
185                                                   
186 void G4SPSRandomGenerator::SetVerbosity(G4int     
187 {                                                 
188   G4AutoLock l(&mutex);                           
189   verbosityLevel = a;                             
190 }                                                 
191                                                   
192 namespace                                         
193 {                                                 
194   G4PhysicsFreeVector ZeroPhysVector; // for r    
195 }                                                 
196                                                   
197 void G4SPSRandomGenerator::ReSetHist(const G4S    
198 {                                                 
199   G4AutoLock l(&mutex);                           
200   if (atype == "biasx") {                         
201                 XBias = false;                    
202                 IPDFXBias = false;                
203                 local_IPDFXBias.Get().val = fa    
204                 XBiasH = IPDFXBiasH = ZeroPhys    
205         } else if (atype == "biasy") {            
206                 YBias = false;                    
207                 IPDFYBias = false;                
208                 local_IPDFYBias.Get().val = fa    
209                 YBiasH = IPDFYBiasH = ZeroPhys    
210         } else if (atype == "biasz") {            
211                 ZBias = false;                    
212                 IPDFZBias = false;                
213                 local_IPDFZBias.Get().val = fa    
214                 ZBiasH = IPDFZBiasH = ZeroPhys    
215         } else if (atype == "biast") {            
216                 ThetaBias = false;                
217                 IPDFThetaBias = false;            
218                 local_IPDFThetaBias.Get().val     
219                 ThetaBiasH = IPDFThetaBiasH =     
220         } else if (atype == "biasp") {            
221                 PhiBias = false;                  
222                 IPDFPhiBias = false;              
223                 local_IPDFPhiBias.Get().val =     
224                 PhiBiasH = IPDFPhiBiasH = Zero    
225         } else if (atype == "biase") {            
226                 EnergyBias = false;               
227                 IPDFEnergyBias = false;           
228                 local_IPDFEnergyBias.Get().val    
229                 EnergyBiasH = IPDFEnergyBiasH     
230         } else if (atype == "biaspt") {           
231                 PosThetaBias = false;             
232                 IPDFPosThetaBias = false;         
233                 local_IPDFPosThetaBias.Get().v    
234                 PosThetaBiasH = IPDFPosThetaBi    
235         } else if (atype == "biaspp") {           
236                 PosPhiBias = false;               
237                 IPDFPosPhiBias = false;           
238                 local_IPDFPosPhiBias.Get().val    
239                 PosPhiBiasH = IPDFPosPhiBiasH     
240         } else {                                  
241                 G4cout << "Error, histtype not    
242   }                                               
243 }                                                 
244                                                   
245 G4double G4SPSRandomGenerator::GenRandX()         
246 {                                                 
247   if (verbosityLevel >= 1)                        
248     G4cout << "In GenRandX" << G4endl;            
249   if (!XBias)                                     
250   {                                               
251     // X is not biased                            
252     G4double rndm = G4UniformRand();              
253     return (rndm);                                
254   }                                               
255                                                   
256   // X is biased                                  
257   // This is shared among threads, and we need    
258   // only once. Multiple instances of this cla    
259   // so we rely on a class-private, thread-pri    
260   // to check if we need an initialiation. We     
261   // because the Boolean on which we check is     
262   //                                              
263   if ( !local_IPDFXBias.Get().val )               
264   {                                               
265     // For time that this thread arrived, here    
266     // Now two cases are possible: it is the f    
267     // ANY thread has ever initialized this.      
268     // Now we need a lock. In any case, the th    
269     // variable can now be set to true            
270     //                                            
271     local_IPDFXBias.Get().val = true;             
272     G4AutoLock l(&mutex);                         
273     if (!IPDFXBias)                               
274     {                                             
275       // IPDF has not been created, so create     
276       //                                          
277       G4double bins[1024], vals[1024], sum;       
278       std::size_t ii;                             
279       std::size_t maxbin = XBiasH.GetVectorLen    
280       bins[0] = XBiasH.GetLowEdgeEnergy(0);       
281       vals[0] = XBiasH(0);                        
282       sum = vals[0];                              
283       for (ii=1; ii<maxbin; ++ii)                 
284       {                                           
285         bins[ii] = XBiasH.GetLowEdgeEnergy(ii)    
286         vals[ii] = XBiasH(ii) + vals[ii - 1];     
287         sum = sum + XBiasH(ii);                   
288       }                                           
289                                                   
290       for (ii=0; ii<maxbin; ++ii)                 
291       {                                           
292         vals[ii] = vals[ii] / sum;                
293         IPDFXBiasH.InsertValues(bins[ii], vals    
294       }                                           
295       IPDFXBias = true;                           
296     }                                             
297   }                                               
298                                                   
299   // IPDF has been create so carry on             
300                                                   
301   G4double rndm = G4UniformRand();                
302                                                   
303   // Calculate the weighting: Find the bin tha    
304   // rndm is in and the weigthing will be the     
305   // natural probability (from the x-axis) div    
306   // difference in the biased probability (the    
307   //                                              
308   std::size_t numberOfBin = IPDFXBiasH.GetVect    
309   std::size_t biasn1 = 0;                         
310   std::size_t biasn2 = numberOfBin / 2;           
311   std::size_t biasn3 = numberOfBin - 1;           
312   while (biasn1 != biasn3 - 1)                    
313   {                                               
314     if (rndm > IPDFXBiasH(biasn2))                
315       { biasn1 = biasn2; }                        
316     else                                          
317       { biasn3 = biasn2; }                        
318     biasn2 = biasn1 + (biasn3 - biasn1 + 1) /     
319   }                                               
320                                                   
321   // Retrieve the areas and then the x-axis va    
322   //                                              
323   bweights_t& w = bweights.Get();                 
324   w[0] = IPDFXBiasH(biasn2) - IPDFXBiasH(biasn    
325   G4double xaxisl = IPDFXBiasH.GetLowEdgeEnerg    
326   G4double xaxisu = IPDFXBiasH.GetLowEdgeEnerg    
327   G4double NatProb = xaxisu - xaxisl;             
328   w[0] = NatProb / w[0];                          
329   if (verbosityLevel >= 1)                        
330   {                                               
331     G4cout << "X bin weight " << w[0] << " " <    
332   }                                               
333   return (IPDFXBiasH.GetEnergy(rndm));            
334                                                   
335 }                                                 
336                                                   
337 G4double G4SPSRandomGenerator::GenRandY()         
338 {                                                 
339   if (verbosityLevel >= 1)                        
340   {                                               
341     G4cout << "In GenRandY" << G4endl;            
342   }                                               
343                                                   
344   if (!YBias)  // Y is not biased                 
345   {                                               
346     G4double rndm = G4UniformRand();              
347     return (rndm);                                
348   }                                               
349                   // Y is biased                  
350       if ( !local_IPDFYBias.Get().val )           
351     {                                             
352       local_IPDFYBias.Get().val = true;           
353       G4AutoLock l(&mutex);                       
354       if (!IPDFYBias)                             
355       {                                           
356         // IPDF has not been created, so creat    
357         //                                        
358         G4double bins[1024], vals[1024], sum;     
359         std::size_t ii;                           
360         std::size_t maxbin = YBiasH.GetVectorL    
361         bins[0] = YBiasH.GetLowEdgeEnergy(0);     
362         vals[0] = YBiasH(0);                      
363         sum = vals[0];                            
364         for (ii=1; ii<maxbin; ++ii)               
365         {                                         
366           bins[ii] = YBiasH.GetLowEdgeEnergy(i    
367           vals[ii] = YBiasH(ii) + vals[ii - 1]    
368           sum = sum + YBiasH(ii);                 
369         }                                         
370                                                   
371         for (ii=0; ii<maxbin; ++ii)               
372         {                                         
373           vals[ii] = vals[ii] / sum;              
374           IPDFYBiasH.InsertValues(bins[ii], va    
375         }                                         
376         IPDFYBias = true;                         
377       }                                           
378     }                                             
379                                                   
380     // IPDF has been created so carry on          
381                                                   
382     G4double rndm = G4UniformRand();              
383     std::size_t numberOfBin = IPDFYBiasH.GetVe    
384     std::size_t biasn1 = 0;                       
385     std::size_t biasn2 = numberOfBin / 2;         
386     std::size_t biasn3 = numberOfBin - 1;         
387     while (biasn1 != biasn3 - 1)                  
388     {                                             
389       if (rndm > IPDFYBiasH(biasn2))              
390         { biasn1 = biasn2; }                      
391       else                                        
392         { biasn3 = biasn2; }                      
393       biasn2 = biasn1 + (biasn3 - biasn1 + 1)     
394     }                                             
395     bweights_t& w = bweights.Get();               
396     w[1] = IPDFYBiasH(biasn2) - IPDFYBiasH(bia    
397     G4double xaxisl = IPDFYBiasH.GetLowEdgeEne    
398     G4double xaxisu = IPDFYBiasH.GetLowEdgeEne    
399     G4double NatProb = xaxisu - xaxisl;           
400     w[1] = NatProb / w[1];                        
401     if (verbosityLevel >= 1)                      
402     {                                             
403       G4cout << "Y bin weight " << w[1] << " "    
404     }                                             
405     return (IPDFYBiasH.GetEnergy(rndm));          
406                                                   
407 }                                                 
408                                                   
409 G4double G4SPSRandomGenerator::GenRandZ()         
410 {                                                 
411   if (verbosityLevel >= 1)                        
412   {                                               
413     G4cout << "In GenRandZ" << G4endl;            
414   }                                               
415                                                   
416   if (!ZBias)  // Z is not biased                 
417   {                                               
418     G4double rndm = G4UniformRand();              
419     return (rndm);                                
420   }                                               
421                   // Z is biased                  
422       if ( !local_IPDFZBias.Get().val )           
423     {                                             
424       local_IPDFZBias.Get().val = true;           
425       G4AutoLock l(&mutex);                       
426       if (!IPDFZBias)                             
427       {                                           
428         // IPDF has not been created, so creat    
429         //                                        
430         G4double bins[1024], vals[1024], sum;     
431         std::size_t ii;                           
432         std::size_t maxbin = ZBiasH.GetVectorL    
433         bins[0] = ZBiasH.GetLowEdgeEnergy(0);     
434         vals[0] = ZBiasH(0);                      
435         sum = vals[0];                            
436         for (ii=1; ii<maxbin; ++ii)               
437         {                                         
438           bins[ii] = ZBiasH.GetLowEdgeEnergy(i    
439           vals[ii] = ZBiasH(ii) + vals[ii - 1]    
440           sum = sum + ZBiasH(ii);                 
441         }                                         
442                                                   
443         for (ii=0; ii<maxbin; ++ii)               
444         {                                         
445           vals[ii] = vals[ii] / sum;              
446           IPDFZBiasH.InsertValues(bins[ii], va    
447         }                                         
448         IPDFZBias = true;                         
449       }                                           
450     }                                             
451                                                   
452     // IPDF has been create so carry on           
453                                                   
454     G4double rndm = G4UniformRand();              
455     std::size_t numberOfBin = IPDFZBiasH.GetVe    
456     std::size_t biasn1 = 0;                       
457     std::size_t biasn2 = numberOfBin / 2;         
458     std::size_t biasn3 = numberOfBin - 1;         
459     while (biasn1 != biasn3 - 1)                  
460     {                                             
461       if (rndm > IPDFZBiasH(biasn2))              
462         { biasn1 = biasn2; }                      
463       else                                        
464         { biasn3 = biasn2; }                      
465       biasn2 = biasn1 + (biasn3 - biasn1 + 1)     
466     }                                             
467     bweights_t& w = bweights.Get();               
468     w[2] = IPDFZBiasH(biasn2) - IPDFZBiasH(bia    
469     G4double xaxisl = IPDFZBiasH.GetLowEdgeEne    
470     G4double xaxisu = IPDFZBiasH.GetLowEdgeEne    
471     G4double NatProb = xaxisu - xaxisl;           
472     w[2] = NatProb / w[2];                        
473     if (verbosityLevel >= 1)                      
474     {                                             
475       G4cout << "Z bin weight " << w[2] << " "    
476     }                                             
477     return (IPDFZBiasH.GetEnergy(rndm));          
478                                                   
479 }                                                 
480                                                   
481 G4double G4SPSRandomGenerator::GenRandTheta()     
482 {                                                 
483   if (verbosityLevel >= 1)                        
484   {                                               
485     G4cout << "In GenRandTheta" << G4endl;        
486     G4cout << "Verbosity " << verbosityLevel <    
487   }                                               
488                                                   
489   if (!ThetaBias)  // Theta is not biased         
490   {                                               
491     G4double rndm = G4UniformRand();              
492     return (rndm);                                
493   }                                               
494                       // Theta is biased          
495       if ( !local_IPDFThetaBias.Get().val )       
496     {                                             
497       local_IPDFThetaBias.Get().val = true;       
498       G4AutoLock l(&mutex);                       
499       if (!IPDFThetaBias)                         
500       {                                           
501         // IPDF has not been created, so creat    
502         //                                        
503         G4double bins[1024], vals[1024], sum;     
504         std::size_t ii;                           
505         std::size_t maxbin = ThetaBiasH.GetVec    
506         bins[0] = ThetaBiasH.GetLowEdgeEnergy(    
507         vals[0] = ThetaBiasH(0);                  
508         sum = vals[0];                            
509         for (ii=1; ii<maxbin; ++ii)               
510         {                                         
511           bins[ii] = ThetaBiasH.GetLowEdgeEner    
512           vals[ii] = ThetaBiasH(ii) + vals[ii     
513           sum = sum + ThetaBiasH(ii);             
514         }                                         
515                                                   
516         for (ii=0; ii<maxbin; ++ii)               
517         {                                         
518           vals[ii] = vals[ii] / sum;              
519           IPDFThetaBiasH.InsertValues(bins[ii]    
520         }                                         
521         IPDFThetaBias = true;                     
522       }                                           
523     }                                             
524                                                   
525     // IPDF has been create so carry on           
526                                                   
527     G4double rndm = G4UniformRand();              
528     std::size_t numberOfBin = IPDFThetaBiasH.G    
529     std::size_t biasn1 = 0;                       
530     std::size_t biasn2 = numberOfBin / 2;         
531     std::size_t biasn3 = numberOfBin - 1;         
532     while (biasn1 != biasn3 - 1)                  
533     {                                             
534       if (rndm > IPDFThetaBiasH(biasn2))          
535         { biasn1 = biasn2; }                      
536       else                                        
537         { biasn3 = biasn2; }                      
538       biasn2 = biasn1 + (biasn3 - biasn1 + 1)     
539     }                                             
540     bweights_t& w = bweights.Get();               
541     w[3] = IPDFThetaBiasH(biasn2) - IPDFThetaB    
542     G4double xaxisl = IPDFThetaBiasH.GetLowEdg    
543     G4double xaxisu = IPDFThetaBiasH.GetLowEdg    
544     G4double NatProb = xaxisu - xaxisl;           
545     w[3] = NatProb / w[3];                        
546     if (verbosityLevel >= 1)                      
547     {                                             
548       G4cout << "Theta bin weight " << w[3] <<    
549     }                                             
550     return (IPDFThetaBiasH.GetEnergy(rndm));      
551                                                   
552 }                                                 
553                                                   
554 G4double G4SPSRandomGenerator::GenRandPhi()       
555 {                                                 
556   if (verbosityLevel >= 1)                        
557   {                                               
558     G4cout << "In GenRandPhi" << G4endl;          
559   }                                               
560                                                   
561   if (!PhiBias)  // Phi is not biased             
562   {                                               
563     G4double rndm = G4UniformRand();              
564     return (rndm);                                
565   }                                               
566                     // Phi is biased              
567       if ( !local_IPDFPhiBias.Get().val )         
568     {                                             
569       local_IPDFPhiBias.Get().val = true;         
570       G4AutoLock l(&mutex);                       
571       if (!IPDFPhiBias)                           
572       {                                           
573         // IPDF has not been created, so creat    
574         //                                        
575         G4double bins[1024], vals[1024], sum;     
576         std::size_t ii;                           
577         std::size_t maxbin = PhiBiasH.GetVecto    
578         bins[0] = PhiBiasH.GetLowEdgeEnergy(0)    
579         vals[0] = PhiBiasH(0);                    
580         sum = vals[0];                            
581         for (ii=1; ii<maxbin; ++ii)               
582         {                                         
583           bins[ii] = PhiBiasH.GetLowEdgeEnergy    
584           vals[ii] = PhiBiasH(ii) + vals[ii -     
585           sum = sum + PhiBiasH(ii);               
586         }                                         
587                                                   
588         for (ii=0; ii<maxbin; ++ii)               
589         {                                         
590           vals[ii] = vals[ii] / sum;              
591           IPDFPhiBiasH.InsertValues(bins[ii],     
592         }                                         
593         IPDFPhiBias = true;                       
594       }                                           
595     }                                             
596                                                   
597     // IPDF has been create so carry on           
598                                                   
599     G4double rndm = G4UniformRand();              
600     std::size_t numberOfBin = IPDFPhiBiasH.Get    
601     std::size_t biasn1 = 0;                       
602     std::size_t biasn2 = numberOfBin / 2;         
603     std::size_t biasn3 = numberOfBin - 1;         
604     while (biasn1 != biasn3 - 1)                  
605     {                                             
606       if (rndm > IPDFPhiBiasH(biasn2))            
607         { biasn1 = biasn2; }                      
608       else                                        
609         { biasn3 = biasn2; }                      
610       biasn2 = biasn1 + (biasn3 - biasn1 + 1)     
611     }                                             
612     bweights_t& w = bweights.Get();               
613     w[4] = IPDFPhiBiasH(biasn2) - IPDFPhiBiasH    
614     G4double xaxisl = IPDFPhiBiasH.GetLowEdgeE    
615     G4double xaxisu = IPDFPhiBiasH.GetLowEdgeE    
616     G4double NatProb = xaxisu - xaxisl;           
617     w[4] = NatProb / w[4];                        
618     if (verbosityLevel >= 1)                      
619     {                                             
620       G4cout << "Phi bin weight " << w[4] << "    
621     }                                             
622     return (IPDFPhiBiasH.GetEnergy(rndm));        
623                                                   
624 }                                                 
625                                                   
626 G4double G4SPSRandomGenerator::GenRandEnergy()    
627 {                                                 
628   if (verbosityLevel >= 1)                        
629   {                                               
630     G4cout << "In GenRandEnergy" << G4endl;       
631   }                                               
632                                                   
633   if (!EnergyBias)  // Energy is not biased       
634   {                                               
635     G4double rndm = G4UniformRand();              
636     return (rndm);                                
637   }                                               
638                        // Energy is biased        
639       if ( !local_IPDFEnergyBias.Get().val )      
640     {                                             
641       local_IPDFEnergyBias.Get().val = true;      
642       G4AutoLock l(&mutex);                       
643       if (!IPDFEnergyBias)                        
644       {                                           
645         // IPDF has not been created, so creat    
646         //                                        
647         G4double bins[1024], vals[1024], sum;     
648         std::size_t ii;                           
649         std::size_t maxbin = EnergyBiasH.GetVe    
650         bins[0] = EnergyBiasH.GetLowEdgeEnergy    
651         vals[0] = EnergyBiasH(0);                 
652         sum = vals[0];                            
653         for (ii=1; ii<maxbin; ++ii)               
654         {                                         
655           bins[ii] = EnergyBiasH.GetLowEdgeEne    
656           vals[ii] = EnergyBiasH(ii) + vals[ii    
657           sum = sum + EnergyBiasH(ii);            
658         }                                         
659         IPDFEnergyBiasH = ZeroPhysVector;         
660         for (ii=0; ii<maxbin; ++ii)               
661         {                                         
662           vals[ii] = vals[ii] / sum;              
663           IPDFEnergyBiasH.InsertValues(bins[ii    
664         }                                         
665         IPDFEnergyBias = true;                    
666       }                                           
667     }                                             
668                                                   
669     // IPDF has been create so carry on           
670                                                   
671     G4double rndm = G4UniformRand();              
672     std::size_t numberOfBin = IPDFEnergyBiasH.    
673     std::size_t biasn1 = 0;                       
674     std::size_t biasn2 = numberOfBin / 2;         
675     std::size_t biasn3 = numberOfBin - 1;         
676     while (biasn1 != biasn3 - 1)                  
677     {                                             
678       if (rndm > IPDFEnergyBiasH(biasn2))         
679         { biasn1 = biasn2; }                      
680       else                                        
681         { biasn3 = biasn2; }                      
682       biasn2 = biasn1 + (biasn3 - biasn1 + 1)     
683     }                                             
684     bweights_t& w = bweights.Get();               
685     w[5] = IPDFEnergyBiasH(biasn2) - IPDFEnerg    
686     G4double xaxisl = IPDFEnergyBiasH.GetLowEd    
687     G4double xaxisu = IPDFEnergyBiasH.GetLowEd    
688     G4double NatProb = xaxisu - xaxisl;           
689     w[5] = NatProb / w[5];                        
690     if (verbosityLevel >= 1)                      
691     {                                             
692       G4cout << "Energy bin weight " << w[5] <    
693     }                                             
694     return (IPDFEnergyBiasH.GetEnergy(rndm));     
695                                                   
696 }                                                 
697                                                   
698 G4double G4SPSRandomGenerator::GenRandPosTheta    
699 {                                                 
700   if (verbosityLevel >= 1)                        
701   {                                               
702     G4cout << "In GenRandPosTheta" << G4endl;     
703     G4cout << "Verbosity " << verbosityLevel <    
704   }                                               
705                                                   
706   if (!PosThetaBias)  // Theta is not biased      
707   {                                               
708     G4double rndm = G4UniformRand();              
709     return (rndm);                                
710   }                                               
711                          // Theta is biased       
712       if ( !local_IPDFPosThetaBias.Get().val )    
713     {                                             
714       local_IPDFPosThetaBias.Get().val = true;    
715       G4AutoLock l(&mutex);                       
716       if (!IPDFPosThetaBias)                      
717       {                                           
718         // IPDF has not been created, so creat    
719         //                                        
720         G4double bins[1024], vals[1024], sum;     
721         std::size_t ii;                           
722         std::size_t maxbin = PosThetaBiasH.Get    
723         bins[0] = PosThetaBiasH.GetLowEdgeEner    
724         vals[0] = PosThetaBiasH(0);               
725         sum = vals[0];                            
726         for (ii=1; ii<maxbin; ++ii)               
727         {                                         
728           bins[ii] = PosThetaBiasH.GetLowEdgeE    
729           vals[ii] = PosThetaBiasH(ii) + vals[    
730           sum = sum + PosThetaBiasH(ii);          
731         }                                         
732                                                   
733         for (ii=0; ii<maxbin; ++ii)               
734         {                                         
735           vals[ii] = vals[ii] / sum;              
736           IPDFPosThetaBiasH.InsertValues(bins[    
737         }                                         
738         IPDFPosThetaBias = true;                  
739       }                                           
740     }                                             
741                                                   
742     // IPDF has been create so carry on           
743     //                                            
744     G4double rndm = G4UniformRand();              
745     std::size_t numberOfBin = IPDFPosThetaBias    
746     std::size_t biasn1 = 0;                       
747     std::size_t biasn2 = numberOfBin / 2;         
748     std::size_t biasn3 = numberOfBin - 1;         
749     while (biasn1 != biasn3 - 1)                  
750     {                                             
751       if (rndm > IPDFPosThetaBiasH(biasn2))       
752         { biasn1 = biasn2; }                      
753       else                                        
754         { biasn3 = biasn2; }                      
755       biasn2 = biasn1 + (biasn3 - biasn1 + 1)     
756     }                                             
757     bweights_t& w = bweights.Get();               
758     w[6] = IPDFPosThetaBiasH(biasn2) - IPDFPos    
759     G4double xaxisl = IPDFPosThetaBiasH.GetLow    
760     G4double xaxisu = IPDFPosThetaBiasH.GetLow    
761     G4double NatProb = xaxisu - xaxisl;           
762     w[6] = NatProb / w[6];                        
763     if (verbosityLevel >= 1)                      
764     {                                             
765       G4cout << "PosTheta bin weight " << w[6]    
766     }                                             
767     return (IPDFPosThetaBiasH.GetEnergy(rndm))    
768                                                   
769 }                                                 
770                                                   
771 G4double G4SPSRandomGenerator::GenRandPosPhi()    
772 {                                                 
773   if (verbosityLevel >= 1)                        
774   {                                               
775     G4cout << "In GenRandPosPhi" << G4endl;       
776   }                                               
777                                                   
778   if (!PosPhiBias)  // PosPhi is not biased       
779   {                                               
780     G4double rndm = G4UniformRand();              
781     return (rndm);                                
782   }                                               
783                        // PosPhi is biased        
784       if (!local_IPDFPosPhiBias.Get().val )       
785     {                                             
786       local_IPDFPosPhiBias.Get().val = true;      
787       G4AutoLock l(&mutex);                       
788       if (!IPDFPosPhiBias)                        
789       {                                           
790         // IPDF has not been created, so creat    
791         //                                        
792         G4double bins[1024], vals[1024], sum;     
793         std::size_t ii;                           
794         std::size_t maxbin = PosPhiBiasH.GetVe    
795         bins[0] = PosPhiBiasH.GetLowEdgeEnergy    
796         vals[0] = PosPhiBiasH(0);                 
797         sum = vals[0];                            
798         for (ii=1; ii<maxbin; ++ii)               
799         {                                         
800           bins[ii] = PosPhiBiasH.GetLowEdgeEne    
801           vals[ii] = PosPhiBiasH(ii) + vals[ii    
802           sum = sum + PosPhiBiasH(ii);            
803         }                                         
804                                                   
805         for (ii=0; ii<maxbin; ++ii)               
806         {                                         
807           vals[ii] = vals[ii] / sum;              
808           IPDFPosPhiBiasH.InsertValues(bins[ii    
809         }                                         
810         IPDFPosPhiBias = true;                    
811       }                                           
812     }                                             
813                                                   
814     // IPDF has been create so carry on           
815                                                   
816     G4double rndm = G4UniformRand();              
817     std::size_t numberOfBin = IPDFPosPhiBiasH.    
818     std::size_t biasn1 = 0;                       
819     std::size_t biasn2 = numberOfBin / 2;         
820     std::size_t biasn3 = numberOfBin - 1;         
821     while (biasn1 != biasn3 - 1)                  
822     {                                             
823       if (rndm > IPDFPosPhiBiasH(biasn2))         
824         { biasn1 = biasn2; }                      
825       else                                        
826         { biasn3 = biasn2; }                      
827       biasn2 = biasn1 + (biasn3 - biasn1 + 1)     
828     }                                             
829     bweights_t& w = bweights.Get();               
830     w[7] = IPDFPosPhiBiasH(biasn2) - IPDFPosPh    
831     G4double xaxisl = IPDFPosPhiBiasH.GetLowEd    
832     G4double xaxisu = IPDFPosPhiBiasH.GetLowEd    
833     G4double NatProb = xaxisu - xaxisl;           
834     w[7] = NatProb / w[7];                        
835     if (verbosityLevel >= 1)                      
836     {                                             
837       G4cout << "PosPhi bin weight " << w[7] <    
838     }                                             
839     return (IPDFPosPhiBiasH.GetEnergy(rndm));     
840                                                   
841 }                                                 
842