source: trunk/source/event/src/G4SPSAngDistribution.cc

Last change on this file was 816, checked in by garnier, 16 years ago

import all except CVS

File size: 19.4 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26///////////////////////////////////////////////////////////////////////////////
27//
28// MODULE:        G4SPSAngDistribution.cc
29//
30// Version:      1.0
31// Date:         5/02/04
32// Author:       Fan Lei
33// Organisation: QinetiQ ltd.
34// Customer:     ESA/ESTEC
35//
36///////////////////////////////////////////////////////////////////////////////
37//
38//
39// CHANGE HISTORY
40// --------------
41//
42//
43// Version 1.0, 05/02/2004, Fan Lei, Created.
44//    Based on the G4GeneralParticleSource class in Geant4 v6.0
45//
46///////////////////////////////////////////////////////////////////////////////
47//
48#include "Randomize.hh"
49#include "G4SPSAngDistribution.hh"
50
51G4SPSAngDistribution::G4SPSAngDistribution()
52{
53  // Angular distribution Variables
54  G4ThreeVector zero;
55  particle_momentum_direction = G4ParticleMomentum(0,0,-1);
56
57  AngDistType = "planar"; 
58  AngRef1 = CLHEP::HepXHat;
59  AngRef2 = CLHEP::HepYHat;
60  AngRef3 = CLHEP::HepZHat;
61  MinTheta = 0.;
62  MaxTheta = pi;
63  MinPhi = 0.;
64  MaxPhi = twopi;
65  DR = 0.;
66  DX = 0.;
67  DY = 0.;
68  FocusPoint = G4ThreeVector(0., 0., 0.);
69  UserDistType = "NULL";
70  UserWRTSurface = true;
71  UserAngRef = false;
72  IPDFThetaExist = false;
73  IPDFPhiExist = false;
74  verbosityLevel = 0 ;
75}
76
77G4SPSAngDistribution::~G4SPSAngDistribution()
78{}
79
80//
81void G4SPSAngDistribution::SetAngDistType(G4String atype)
82{
83  if(atype != "iso" && atype != "cos" && atype != "user" && atype != "planar"
84     && atype != "beam1d" && atype != "beam2d"  && atype != "focused")
85    G4cout << "Error, distribution must be iso, cos, planar, beam1d, beam2d, focused or user" << G4endl;
86  else
87    AngDistType = atype;
88  if (AngDistType == "cos") MaxTheta = pi/2. ;
89  if (AngDistType == "user") {
90    UDefThetaH = IPDFThetaH = ZeroPhysVector ;
91    IPDFThetaExist = false ;
92    UDefPhiH = IPDFPhiH = ZeroPhysVector ;
93    IPDFPhiExist = false ;
94  }
95}
96
97void G4SPSAngDistribution::DefineAngRefAxes(G4String refname, G4ThreeVector ref)
98{
99  if(refname == "angref1")
100    AngRef1 = ref.unit(); // x'
101  else if(refname == "angref2")
102    AngRef2 = ref.unit(); // vector in x'y' plane
103
104  // User defines x' (AngRef1) and a vector in the x'y'
105  // plane (AngRef2). Then, AngRef1 x AngRef2 = AngRef3
106  // the z' vector. Then, AngRef3 x AngRef1 = AngRef2
107  // which will now be y'.
108
109  AngRef3 = AngRef1.cross(AngRef2); // z'
110  AngRef2 = AngRef3.cross(AngRef1); // y'
111  UserAngRef = true ;
112  if(verbosityLevel == 2)
113    {
114      G4cout << "Angular distribution rotation axes " << AngRef1 << " " << AngRef2 << " " << AngRef3 << G4endl;
115    }
116}
117
118void G4SPSAngDistribution::SetMinTheta(G4double mint)
119{
120  MinTheta = mint;
121}
122
123void G4SPSAngDistribution::SetMinPhi(G4double minp)
124{
125  MinPhi = minp;
126}
127
128void G4SPSAngDistribution::SetMaxTheta(G4double maxt)
129{
130  MaxTheta = maxt;
131}
132
133void G4SPSAngDistribution::SetMaxPhi(G4double maxp)
134{
135  MaxPhi = maxp;
136}
137
138void G4SPSAngDistribution::SetBeamSigmaInAngR(G4double r)
139{
140  DR = r;
141}
142
143void G4SPSAngDistribution::SetBeamSigmaInAngX(G4double r)
144{
145  DX = r;
146}
147
148void G4SPSAngDistribution::SetBeamSigmaInAngY(G4double r)
149{
150  DY = r;
151}
152
153void G4SPSAngDistribution::UserDefAngTheta(G4ThreeVector input)
154{
155  if(UserDistType == "NULL") UserDistType = "theta";
156  if(UserDistType == "phi") UserDistType = "both"; 
157  G4double thi, val;
158  thi = input.x();
159  val = input.y();
160  if(verbosityLevel >= 1)
161    G4cout << "In UserDefAngTheta" << G4endl;
162  UDefThetaH.InsertValues(thi, val);
163}
164
165void G4SPSAngDistribution::UserDefAngPhi(G4ThreeVector input)
166{
167  if(UserDistType == "NULL") UserDistType = "phi";
168  if(UserDistType == "theta") UserDistType = "both"; 
169  G4double phhi, val;
170  phhi = input.x();
171  val = input.y();
172  if(verbosityLevel >= 1)
173    G4cout << "In UserDefAngPhi" << G4endl;
174  UDefPhiH.InsertValues(phhi, val); 
175}
176
177void G4SPSAngDistribution::SetFocusPoint(G4ThreeVector input)
178{
179  FocusPoint = input;
180}
181
182void G4SPSAngDistribution::SetUserWRTSurface(G4bool wrtSurf)
183{
184  // This is only applied in user mode?
185  // if UserWRTSurface = true then the user wants momenta with respect
186  // to the surface normals.
187  // When doing this theta has to be 0-90 only otherwise there will be
188  // errors, which currently are flagged anywhere.
189  UserWRTSurface = wrtSurf;
190}
191
192void G4SPSAngDistribution::SetUseUserAngAxis(G4bool userang)
193{
194  // if UserAngRef = true  the angular distribution is defined wrt
195  // the user defined co-ordinates
196  UserAngRef = userang;
197}
198
199void G4SPSAngDistribution::GenerateBeamFlux()
200{
201  G4double theta, phi;
202  G4double px, py, pz;
203  if (AngDistType == "beam1d") 
204    { 
205      theta = G4RandGauss::shoot(0.0,DR);
206      phi = twopi * G4UniformRand();
207    }
208  else 
209    { 
210      px = G4RandGauss::shoot(0.0,DX);
211      py = G4RandGauss::shoot(0.0,DY);
212      theta = std::sqrt (px*px + py*py);
213      if (theta != 0.) { 
214        phi = std::acos(px/theta);
215        if ( py < 0.) phi = -phi;
216      }
217      else
218        { 
219          phi = 0.0;
220        }
221    }
222  px = -std::sin(theta) * std::cos(phi);
223  py = -std::sin(theta) * std::sin(phi);
224  pz = -std::cos(theta);
225  G4double finx, finy,  finz ;
226  finx = px, finy =py, finz =pz;
227  if (UserAngRef){
228    // Apply Angular Rotation Matrix
229    // x * AngRef1, y * AngRef2 and z * AngRef3
230    finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x());
231    finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y());
232    finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z());
233    G4double ResMag = std::sqrt((finx*finx) + (finy*finy) + (finz*finz));
234    finx = finx/ResMag;
235    finy = finy/ResMag;
236    finz = finz/ResMag;
237  }
238  particle_momentum_direction.setX(finx);
239  particle_momentum_direction.setY(finy);
240  particle_momentum_direction.setZ(finz);
241
242  // particle_momentum_direction now holds unit momentum vector.
243  if(verbosityLevel >= 1)
244    G4cout << "Generating beam vector: " << particle_momentum_direction << G4endl;
245}
246
247void G4SPSAngDistribution::GenerateFocusedFlux()
248{
249  particle_momentum_direction = (FocusPoint - posDist->particle_position).unit();
250  //
251  // particle_momentum_direction now holds unit momentum vector.
252  if(verbosityLevel >= 1)
253    G4cout << "Generating focused vector: " << particle_momentum_direction << G4endl;
254}
255
256void G4SPSAngDistribution::GenerateIsotropicFlux()
257{
258  // generates isotropic flux.
259  // No vectors are needed.
260  G4double rndm, rndm2;
261  G4double px, py, pz;
262
263  //
264  G4double sintheta, sinphi,costheta,cosphi;
265  rndm = angRndm->GenRandTheta();
266  costheta = std::cos(MinTheta) - rndm * (std::cos(MinTheta) - std::cos(MaxTheta));
267  sintheta = std::sqrt(1. - costheta*costheta);
268 
269  rndm2 = angRndm->GenRandPhi();
270  Phi = MinPhi + (MaxPhi - MinPhi) * rndm2; 
271  sinphi = std::sin(Phi);
272  cosphi = std::cos(Phi);
273
274  px = -sintheta * cosphi;
275  py = -sintheta * sinphi;
276  pz = -costheta;
277
278  // for volume and ponit source use mother or user defined co-ordinates
279  // for plane and surface source user surface-normal or userdefined co-ordinates
280  //
281  G4double finx, finy, finz;
282  if (posDist->SourcePosType == "Point" || posDist->SourcePosType == "Volume") {
283    if (UserAngRef){
284      // Apply Rotation Matrix
285      // x * AngRef1, y * AngRef2 and z * AngRef3
286      finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x());
287      finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y());
288      finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z());
289    } else {
290      finx = px;
291      finy = py;
292      finz = pz;
293    }
294  } else {    // for plane and surface source   
295    if (UserAngRef){
296      // Apply Rotation Matrix
297      // x * AngRef1, y * AngRef2 and z * AngRef3
298      finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x());
299      finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y());
300      finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z());
301    } else {
302      finx = (px*posDist->SideRefVec1.x()) + (py*posDist->SideRefVec2.x()) + (pz*posDist->SideRefVec3.x());
303      finy = (px*posDist->SideRefVec1.y()) + (py*posDist->SideRefVec2.y()) + (pz*posDist->SideRefVec3.y());
304      finz = (px*posDist->SideRefVec1.z()) + (py*posDist->SideRefVec2.z()) + (pz*posDist->SideRefVec3.z());
305    }
306  }
307  G4double ResMag = std::sqrt((finx*finx) + (finy*finy) + (finz*finz));
308  finx = finx/ResMag;
309  finy = finy/ResMag;
310  finz = finz/ResMag;
311
312  particle_momentum_direction.setX(finx);
313  particle_momentum_direction.setY(finy);
314  particle_momentum_direction.setZ(finz);
315
316  // particle_momentum_direction now holds unit momentum vector.
317  if(verbosityLevel >= 1)
318    G4cout << "Generating isotropic vector: " << particle_momentum_direction << G4endl;
319}
320
321void G4SPSAngDistribution::GenerateCosineLawFlux()
322{
323  // Method to generate flux distributed with a cosine law
324  G4double px, py, pz;
325  G4double rndm, rndm2;
326  //
327  G4double sintheta, sinphi,costheta,cosphi;
328  rndm = angRndm->GenRandTheta();
329  sintheta = std::sqrt( rndm * (std::sin(MaxTheta)*std::sin(MaxTheta) - std::sin(MinTheta)*std::sin(MinTheta) ) 
330                   +std::sin(MinTheta)*std::sin(MinTheta) );
331  costheta = std::sqrt(1. -sintheta*sintheta);
332 
333  rndm2 = angRndm->GenRandPhi();
334  Phi = MinPhi + (MaxPhi - MinPhi) * rndm2; 
335  sinphi = std::sin(Phi);
336  cosphi = std::cos(Phi);
337
338  px = -sintheta * cosphi;
339  py = -sintheta * sinphi;
340  pz = -costheta;
341
342  // for volume and ponit source use mother or user defined co-ordinates
343  // for plane and surface source user surface-normal or userdefined co-ordinates
344  //
345  G4double finx, finy, finz;
346  if (posDist->SourcePosType == "Point" || posDist->SourcePosType == "Volume") {
347    if (UserAngRef){
348      // Apply Rotation Matrix
349      finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x());
350      finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y());
351      finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z());
352    } else {
353      finx = px;
354      finy = py;
355      finz = pz;
356    }
357  } else {    // for plane and surface source   
358    if (UserAngRef){
359      // Apply Rotation Matrix
360      finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x());
361      finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y());
362      finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z());
363    } else {
364      finx = (px*posDist->SideRefVec1.x()) + (py*posDist->SideRefVec2.x()) + (pz*posDist->SideRefVec3.x());
365      finy = (px*posDist->SideRefVec1.y()) + (py*posDist->SideRefVec2.y()) + (pz*posDist->SideRefVec3.y());
366      finz = (px*posDist->SideRefVec1.z()) + (py*posDist->SideRefVec2.z()) + (pz*posDist->SideRefVec3.z());
367    }
368  }
369  G4double ResMag = std::sqrt((finx*finx) + (finy*finy) + (finz*finz));
370  finx = finx/ResMag;
371  finy = finy/ResMag;
372  finz = finz/ResMag;
373
374  particle_momentum_direction.setX(finx);
375  particle_momentum_direction.setY(finy);
376  particle_momentum_direction.setZ(finz);
377
378  // particle_momentum_direction now contains unit momentum vector.
379  if(verbosityLevel >= 1)
380    {
381      G4cout << "Resultant cosine-law unit momentum vector " << particle_momentum_direction << G4endl;
382    }
383}
384
385void G4SPSAngDistribution::GeneratePlanarFlux()
386{
387  // particle_momentum_direction now contains unit momentum vector.
388  // nothing need be done here as the m-directions have been set directly
389  // under this option
390  if(verbosityLevel >= 1)
391    {
392      G4cout << "Resultant Planar wave  momentum vector " << particle_momentum_direction << G4endl;
393    }
394}
395
396void G4SPSAngDistribution::GenerateUserDefFlux()
397{
398  G4double rndm, px, py, pz, pmag;
399
400  if(UserDistType == "NULL")
401    G4cout << "Error: UserDistType undefined" << G4endl;
402  else if(UserDistType == "theta") {
403    Theta = 10.;
404    while(Theta > MaxTheta || Theta < MinTheta)
405      Theta = GenerateUserDefTheta();
406    Phi = 10.;
407    while(Phi > MaxPhi || Phi < MinPhi) {
408      rndm = angRndm->GenRandPhi();
409      Phi = twopi * rndm;
410    }
411  }
412  else if(UserDistType == "phi") {
413    Theta = 10.;
414    while(Theta > MaxTheta || Theta < MinTheta)
415      {
416        rndm = angRndm->GenRandTheta();
417        Theta = std::acos(1. - (2. * rndm));
418      }
419    Phi = 10.;
420    while(Phi > MaxPhi || Phi < MinPhi)
421      Phi = GenerateUserDefPhi();
422  }
423  else if(UserDistType == "both")
424    {
425      Theta = 10.;
426      while(Theta > MaxTheta || Theta < MinTheta)     
427        Theta = GenerateUserDefTheta();
428      Phi = 10.;
429      while(Phi > MaxPhi || Phi < MinPhi)
430        Phi = GenerateUserDefPhi();
431    }
432  px = -std::sin(Theta) * std::cos(Phi);
433  py = -std::sin(Theta) * std::sin(Phi);
434  pz = -std::cos(Theta);
435
436  pmag = std::sqrt((px*px) + (py*py) + (pz*pz));
437
438  if(!UserWRTSurface) {
439    G4double finx, finy, finz;     
440    if (UserAngRef) {
441      // Apply Rotation Matrix
442      // x * AngRef1, y * AngRef2 and z * AngRef3
443      finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x());
444      finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y());
445      finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z());
446    } else {  // use mother co-ordinates
447      finx = px;
448      finy = py;
449      finz = pz;
450    }
451    G4double ResMag = std::sqrt((finx*finx) + (finy*finy) + (finz*finz));
452    finx = finx/ResMag;
453    finy = finy/ResMag;
454    finz = finz/ResMag;
455   
456    particle_momentum_direction.setX(finx);
457    particle_momentum_direction.setY(finy);
458    particle_momentum_direction.setZ(finz);     
459  } 
460  else  {  // UserWRTSurface = true
461    G4double pxh = px/pmag;
462    G4double pyh = py/pmag;
463    G4double pzh = pz/pmag;
464    if(verbosityLevel > 1) {
465      G4cout <<"SideRefVecs " <<posDist->SideRefVec1<<posDist->SideRefVec2<<posDist->SideRefVec3<<G4endl;
466      G4cout <<"Raw Unit vector "<<pxh<<","<<pyh<<","<<pzh<<G4endl;
467    }
468    G4double resultx = (pxh*posDist->SideRefVec1.x()) + (pyh*posDist->SideRefVec2.x()) + 
469      (pzh*posDist->SideRefVec3.x());
470   
471    G4double resulty = (pxh*posDist->SideRefVec1.y()) + (pyh*posDist->SideRefVec2.y()) + 
472      (pzh*posDist->SideRefVec3.y());
473   
474    G4double resultz = (pxh*posDist->SideRefVec1.z()) + (pyh*posDist->SideRefVec2.z()) + 
475      (pzh*posDist->SideRefVec3.z());
476   
477    G4double ResMag = std::sqrt((resultx*resultx) + (resulty*resulty) + (resultz*resultz));
478    resultx = resultx/ResMag;
479    resulty = resulty/ResMag;
480    resultz = resultz/ResMag;
481   
482    particle_momentum_direction.setX(resultx);
483    particle_momentum_direction.setY(resulty);
484    particle_momentum_direction.setZ(resultz);
485  }
486 
487  // particle_momentum_direction now contains unit momentum vector.
488  if(verbosityLevel > 0 )
489    {
490      G4cout << "Final User Defined momentum vector " << particle_momentum_direction << G4endl;
491    }
492}
493
494G4double G4SPSAngDistribution::GenerateUserDefTheta()
495{
496  // Create cumulative histogram if not already done so. Then use RandFlat
497  //::shoot to generate the output Theta value.
498  if(UserDistType == "NULL" || UserDistType == "phi")
499    {
500      // No user defined theta distribution
501      G4cout << "Error ***********************" << G4endl;
502      G4cout << "UserDistType = " << UserDistType << G4endl;
503      return (0.);
504    }
505  else
506    {
507      // UserDistType = theta or both and so a theta distribution
508      // is defined. This should be integrated if not already done.
509      if(IPDFThetaExist == false)
510        {
511          // IPDF has not been created, so create it
512          G4double bins[1024],vals[1024], sum;
513          G4int ii;
514          G4int maxbin = G4int(UDefThetaH.GetVectorLength());
515          bins[0] = UDefThetaH.GetLowEdgeEnergy(size_t(0));
516          vals[0] = UDefThetaH(size_t(0));
517          sum = vals[0];
518          for(ii=1;ii<maxbin;ii++)
519            {
520              bins[ii] = UDefThetaH.GetLowEdgeEnergy(size_t(ii));
521              vals[ii] = UDefThetaH(size_t(ii)) + vals[ii-1];
522              sum = sum + UDefThetaH(size_t(ii));
523            }
524          for(ii=0;ii<maxbin;ii++)
525            {
526              vals[ii] = vals[ii]/sum;
527              IPDFThetaH.InsertValues(bins[ii], vals[ii]);
528            }
529          // Make IPDFThetaExist = true
530          IPDFThetaExist = true;
531        }
532      // IPDF has been create so carry on
533      G4double rndm = G4UniformRand();
534      return(IPDFThetaH.GetEnergy(rndm));
535    }
536}
537
538G4double G4SPSAngDistribution::GenerateUserDefPhi()
539{
540  // Create cumulative histogram if not already done so. Then use RandFlat
541  //::shoot to generate the output Theta value.
542
543  if(UserDistType == "NULL" || UserDistType == "theta")
544    {
545      // No user defined phi distribution
546      G4cout << "Error ***********************" << G4endl;
547      G4cout << "UserDistType = " << UserDistType << G4endl;
548      return(0.);
549    }
550  else
551    {
552      // UserDistType = phi or both and so a phi distribution
553      // is defined. This should be integrated if not already done.
554      if(IPDFPhiExist == false)
555        {
556          // IPDF has not been created, so create it
557          G4double bins[1024],vals[1024], sum;
558          G4int ii;
559          G4int maxbin = G4int(UDefPhiH.GetVectorLength());
560          bins[0] = UDefPhiH.GetLowEdgeEnergy(size_t(0));
561          vals[0] = UDefPhiH(size_t(0));
562          sum = vals[0];
563          for(ii=1;ii<maxbin;ii++)
564            {
565              bins[ii] = UDefPhiH.GetLowEdgeEnergy(size_t(ii));
566              vals[ii] = UDefPhiH(size_t(ii)) + vals[ii-1];
567              sum = sum + UDefPhiH(size_t(ii));
568            }
569
570          for(ii=0;ii<maxbin;ii++)
571            {
572              vals[ii] = vals[ii]/sum;
573              IPDFPhiH.InsertValues(bins[ii], vals[ii]);
574            }
575          // Make IPDFPhiExist = true
576          IPDFPhiExist = true;
577        }
578      // IPDF has been create so carry on
579      G4double rndm = G4UniformRand();
580      return(IPDFPhiH.GetEnergy(rndm));
581    }
582}
583//
584void G4SPSAngDistribution::ReSetHist(G4String atype)
585{
586  if (atype == "theta") {
587    UDefThetaH = IPDFThetaH = ZeroPhysVector ;
588    IPDFThetaExist = false ;}
589  else if (atype == "phi"){   
590    UDefPhiH = IPDFPhiH = ZeroPhysVector ;
591    IPDFPhiExist = false ;} 
592  else {
593    G4cout << "Error, histtype not accepted " << G4endl;
594  }
595}
596
597
598G4ParticleMomentum G4SPSAngDistribution::GenerateOne()
599{
600  // Angular stuff
601  if(AngDistType == "iso")
602    GenerateIsotropicFlux();
603  else if(AngDistType == "cos")
604    GenerateCosineLawFlux();
605  else if(AngDistType == "planar")
606    GeneratePlanarFlux();
607  else if(AngDistType == "beam1d" || AngDistType == "beam2d" )
608    GenerateBeamFlux();
609  else if(AngDistType == "user")
610    GenerateUserDefFlux();
611  else if(AngDistType == "focused")
612    GenerateFocusedFlux();
613  else
614    G4cout << "Error: AngDistType has unusual value" << G4endl;
615  return particle_momentum_direction;
616}
617
618
619
620
621
622
623
624
625
Note: See TracBrowser for help on using the repository browser.