Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4SPSAngDistribution.cc
Go to the documentation of this file.
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// G4SPSAngDistribution class implementation
27//
28// Author: Fan Lei, QinetiQ ltd. - 05/02/2004
29// Customer: ESA/ESTEC
30// Revisions: Andrea Dotti, SLAC
31// --------------------------------------------------------------------
32
34
35#include "Randomize.hh"
37
39{
40 // Angular distribution Variables
41 G4ThreeVector zero;
42 particle_momentum_direction = G4ParticleMomentum(0,0,-1);
43
44 AngDistType = "planar";
45 AngRef1 = CLHEP::HepXHat;
46 AngRef2 = CLHEP::HepYHat;
47 AngRef3 = CLHEP::HepZHat;
48 MinTheta = 0.;
49 MaxTheta = pi;
50 MinPhi = 0.;
51 MaxPhi = twopi;
52 DR = 0.;
53 DX = 0.;
54 DY = 0.;
55 FocusPoint = G4ThreeVector(0., 0., 0.);
56 UserDistType = "NULL";
57 UserWRTSurface = true;
58 UserAngRef = false;
59 IPDFThetaExist = false;
60 IPDFPhiExist = false;
61 verbosityLevel = 0;
62
64}
65
67{
69}
70
72{
73 G4AutoLock l(&mutex);
74 if(atype != "iso" && atype != "cos" && atype != "user" && atype != "planar"
75 && atype != "beam1d" && atype != "beam2d" && atype != "focused")
76 {
77 G4cout << "Error, distribution must be iso, cos, planar, beam1d, beam2d, focused or user"
78 << G4endl;
79 }
80 else
81 {
82 AngDistType = atype;
83 }
84 if (AngDistType == "cos") { MaxTheta = pi/2.; }
85 if (AngDistType == "user")
86 {
87 UDefThetaH = IPDFThetaH = ZeroPhysVector;
88 IPDFThetaExist = false;
89 UDefPhiH = IPDFPhiH = ZeroPhysVector;
90 IPDFPhiExist = false;
91 }
92}
93
95 const G4ThreeVector& ref)
96{
97 G4AutoLock l(&mutex);
98 if (refname == "angref1")
99 AngRef1 = ref.unit(); // x'
100 else if (refname == "angref2")
101 AngRef2 = ref.unit(); // vector in x'y' plane
102
103 // User defines x' (AngRef1) and a vector in the x'y'
104 // plane (AngRef2). Then, AngRef1 x AngRef2 = AngRef3
105 // the z' vector. Then, AngRef3 x AngRef1 = AngRef2
106 // which will now be y'.
107
108 AngRef3 = AngRef1.cross(AngRef2); // z'
109 AngRef2 = AngRef3.cross(AngRef1); // y'
110 UserAngRef = true ;
111 if(verbosityLevel == 2)
112 {
113 G4cout << "Angular distribution rotation axes " << AngRef1
114 << " " << AngRef2 << " " << AngRef3 << G4endl;
115 }
116}
117
119{
120 G4AutoLock l(&mutex);
121 MinTheta = mint;
122}
123
125{
126 G4AutoLock l(&mutex);
127 MinPhi = minp;
128}
129
131{
132 G4AutoLock l(&mutex);
133 MaxTheta = maxt;
134}
135
137{
138 G4AutoLock l(&mutex);
139 MaxPhi = maxp;
140}
141
143{
144 G4AutoLock l(&mutex);
145 DR = r;
146}
147
149{
150 G4AutoLock l(&mutex);
151 DX = r;
152}
153
155{
156 G4AutoLock l(&mutex);
157 DY = r;
158}
159
161SetParticleMomentumDirection(const G4ParticleMomentum& aMomentumDirection)
162{
163 G4AutoLock l(&mutex);
164 particle_momentum_direction = aMomentumDirection.unit();
165}
166
168{
169 G4AutoLock l(&mutex);
170 posDist = a;
171}
172
174{
175 G4AutoLock l(&mutex);
176 angRndm = a;
177}
178
180{
181 G4AutoLock l(&mutex);
182 verbosityLevel = a;
183}
184
186{
187 G4AutoLock l(&mutex);
188 if(UserDistType == "NULL") UserDistType = "theta";
189 if(UserDistType == "phi") UserDistType = "both";
190 G4double thi, val;
191 thi = input.x();
192 val = input.y();
193 if(verbosityLevel >= 1) G4cout << "In UserDefAngTheta" << G4endl;
194 UDefThetaH.InsertValues(thi, val);
195}
196
198{
199 G4AutoLock l(&mutex);
200 return AngDistType;
201}
202
204{
205 G4AutoLock l(&mutex);
206 return MinTheta;
207}
208
210{
211 G4AutoLock l(&mutex);
212 return MaxTheta;
213}
214
216{
217 G4AutoLock l(&mutex);
218 return MinPhi;
219}
220
222{
223 G4AutoLock l(&mutex);
224 return MaxPhi;
225}
226
228{
229 G4AutoLock l(&mutex);
230 return particle_momentum_direction;
231}
232
234{
235 G4AutoLock l(&mutex);
236 if(UserDistType == "NULL") UserDistType = "phi";
237 if(UserDistType == "theta") UserDistType = "both";
238 G4double phhi, val;
239 phhi = input.x();
240 val = input.y();
241 if(verbosityLevel >= 1) G4cout << "In UserDefAngPhi" << G4endl;
242 UDefPhiH.InsertValues(phhi, val);
243}
244
246{
247 G4AutoLock l(&mutex);
248 FocusPoint = input;
249}
250
252{
253 G4AutoLock l(&mutex);
254
255 // if UserWRTSurface = true then the user wants momenta with respect
256 // to the surface normals.
257 // When doing this theta has to be 0-90 only otherwise there will be
258 // errors, which currently are flagged anywhere.
259 //
260 UserWRTSurface = wrtSurf;
261}
262
264{
265 G4AutoLock l(&mutex);
266
267 // if UserAngRef = true the angular distribution is defined wrt
268 // the user defined coordinates
269 //
270 UserAngRef = userang;
271}
272
273void G4SPSAngDistribution::GenerateBeamFlux(G4ParticleMomentum& mom)
274{
275 G4double theta, phi;
276 G4double px, py, pz;
277 if (AngDistType == "beam1d")
278 {
279 theta = G4RandGauss::shoot(0.0,DR);
280 phi = twopi * G4UniformRand();
281 }
282 else
283 {
284 px = G4RandGauss::shoot(0.0,DX);
285 py = G4RandGauss::shoot(0.0,DY);
286 theta = std::sqrt (px*px + py*py);
287 if (theta != 0.)
288 {
289 phi = std::acos(px/theta);
290 if ( py < 0.) phi = -phi;
291 }
292 else
293 {
294 phi = 0.0;
295 }
296 }
297 px = -std::sin(theta) * std::cos(phi);
298 py = -std::sin(theta) * std::sin(phi);
299 pz = -std::cos(theta);
300 G4double finx, finy, finz;
301 finx=px, finy=py, finz=pz;
302 if (UserAngRef)
303 {
304 // Apply Angular Rotation Matrix
305 // x * AngRef1, y * AngRef2 and z * AngRef3
306 finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x());
307 finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y());
308 finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z());
309 G4double ResMag = std::sqrt((finx*finx) + (finy*finy) + (finz*finz));
310 finx = finx/ResMag;
311 finy = finy/ResMag;
312 finz = finz/ResMag;
313 }
314 mom.setX(finx);
315 mom.setY(finy);
316 mom.setZ(finz);
317
318 // particle_momentum_direction now holds unit momentum vector
319
320 if(verbosityLevel >= 1)
321 {
322 G4cout << "Generating beam vector: " << mom << G4endl;
323 }
324}
325
326void G4SPSAngDistribution::GenerateFocusedFlux(G4ParticleMomentum& mom)
327{
328 mom = (FocusPoint - posDist->GetParticlePos()).unit();
329
330 // particle_momentum_direction now holds unit momentum vector.
331
332 if(verbosityLevel >= 1)
333 {
334 G4cout << "Generating focused vector: " << mom << G4endl;
335 }
336}
337
338void G4SPSAngDistribution::GenerateIsotropicFlux(G4ParticleMomentum& mom)
339{
340 // generates isotropic flux.
341 // No vectors are needed.
342
343 G4double rndm, rndm2;
344 G4double px, py, pz;
345
346 G4double sintheta, sinphi,costheta,cosphi;
347 rndm = angRndm->GenRandTheta();
348 costheta = std::cos(MinTheta) - rndm * (std::cos(MinTheta)
349 - std::cos(MaxTheta));
350 sintheta = std::sqrt(1. - costheta*costheta);
351
352 rndm2 = angRndm->GenRandPhi();
353 Phi = MinPhi + (MaxPhi - MinPhi) * rndm2;
354 sinphi = std::sin(Phi);
355 cosphi = std::cos(Phi);
356
357 px = -sintheta * cosphi;
358 py = -sintheta * sinphi;
359 pz = -costheta;
360
361 // For volume and point source use mother or user defined coordinates
362 // for plane and surface source user surface-normal or user-defined
363 // coordinates
364 //
365 G4double finx, finy, finz;
366 if (posDist->GetSourcePosType() == "Point"
367 || posDist->GetSourcePosType() == "Volume")
368 {
369 if (UserAngRef)
370 {
371 // Apply Rotation Matrix
372 // x * AngRef1, y * AngRef2 and z * AngRef3
373 finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x());
374 finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y());
375 finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z());
376 }
377 else
378 {
379 finx = px;
380 finy = py;
381 finz = pz;
382 }
383 }
384 else
385 { // for plane and surface source
386 if (UserAngRef)
387 {
388 // Apply Rotation Matrix
389 // x * AngRef1, y * AngRef2 and z * AngRef3
390 finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x());
391 finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y());
392 finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z());
393 }
394 else
395 {
396 finx = (px*posDist->GetSideRefVec1().x())
397 + (py*posDist->GetSideRefVec2().x())
398 + (pz*posDist->GetSideRefVec3().x());
399 finy = (px*posDist->GetSideRefVec1().y())
400 + (py*posDist->GetSideRefVec2().y())
401 + (pz*posDist->GetSideRefVec3().y());
402 finz = (px*posDist->GetSideRefVec1().z())
403 + (py*posDist->GetSideRefVec2().z())
404 + (pz*posDist->GetSideRefVec3().z());
405 }
406 }
407 G4double ResMag = std::sqrt((finx*finx) + (finy*finy) + (finz*finz));
408 finx = finx/ResMag;
409 finy = finy/ResMag;
410 finz = finz/ResMag;
411
412 mom.setX(finx);
413 mom.setY(finy);
414 mom.setZ(finz);
415
416 // particle_momentum_direction now holds unit momentum vector.
417
418 if(verbosityLevel >= 1)
419 {
420 G4cout << "Generating isotropic vector: " << mom << G4endl;
421 }
422}
423
424void G4SPSAngDistribution::GenerateCosineLawFlux(G4ParticleMomentum& mom)
425{
426 // Method to generate flux distributed with a cosine law
427
428 G4double px, py, pz;
429 G4double rndm, rndm2;
430
431 G4double sintheta, sinphi,costheta,cosphi;
432 rndm = angRndm->GenRandTheta();
433 sintheta = std::sqrt( rndm * (std::sin(MaxTheta)*std::sin(MaxTheta)
434 - std::sin(MinTheta)*std::sin(MinTheta) )
435 + std::sin(MinTheta)*std::sin(MinTheta) );
436 costheta = std::sqrt(1. -sintheta*sintheta);
437
438 rndm2 = angRndm->GenRandPhi();
439 Phi = MinPhi + (MaxPhi - MinPhi) * rndm2;
440 sinphi = std::sin(Phi);
441 cosphi = std::cos(Phi);
442
443 px = -sintheta * cosphi;
444 py = -sintheta * sinphi;
445 pz = -costheta;
446
447 // for volume and point source use mother or user defined coordinates
448 // for plane and surface source user surface-normal or userdefined
449 // coordinates
450 //
451 G4double finx, finy, finz;
452 if (posDist->GetSourcePosType() == "Point"
453 || posDist->GetSourcePosType() == "Volume")
454 {
455 if (UserAngRef)
456 {
457 // Apply Rotation Matrix
458 finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x());
459 finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y());
460 finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z());
461 }
462 else
463 {
464 finx = px;
465 finy = py;
466 finz = pz;
467 }
468 }
469 else
470 { // for plane and surface source
471 if (UserAngRef)
472 {
473 // Apply Rotation Matrix
474 finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x());
475 finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y());
476 finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z());
477 }
478 else
479 {
480 finx = (px*posDist->GetSideRefVec1().x())
481 + (py*posDist->GetSideRefVec2().x())
482 + (pz*posDist->GetSideRefVec3().x());
483 finy = (px*posDist->GetSideRefVec1().y())
484 + (py*posDist->GetSideRefVec2().y())
485 + (pz*posDist->GetSideRefVec3().y());
486 finz = (px*posDist->GetSideRefVec1().z())
487 + (py*posDist->GetSideRefVec2().z())
488 + (pz*posDist->GetSideRefVec3().z());
489 }
490 }
491 G4double ResMag = std::sqrt((finx*finx) + (finy*finy) + (finz*finz));
492 finx = finx/ResMag;
493 finy = finy/ResMag;
494 finz = finz/ResMag;
495
496 mom.setX(finx);
497 mom.setY(finy);
498 mom.setZ(finz);
499
500 // particle_momentum_direction now contains unit momentum vector.
501
502 if(verbosityLevel >= 1)
503 {
504 G4cout << "Resultant cosine-law unit momentum vector " << mom << G4endl;
505 }
506}
507
508void G4SPSAngDistribution::GeneratePlanarFlux(G4ParticleMomentum& mom)
509{
510 // particle_momentum_direction now contains unit momentum vector.
511 // nothing need be done here as the m-directions have been set directly
512 // under this option
513
514 if(verbosityLevel >= 1)
515 {
516 G4cout << "Resultant Planar wave momentum vector " << mom << G4endl;
517 }
518}
519
520void G4SPSAngDistribution::GenerateUserDefFlux(G4ParticleMomentum& mom)
521{
522 G4double rndm, px, py, pz, pmag;
523
524 if(UserDistType == "NULL")
525 {
526 G4cout << "Error: UserDistType undefined" << G4endl;
527 }
528 else if(UserDistType == "theta")
529 {
530 Theta = 10.;
531 while(Theta > MaxTheta || Theta < MinTheta)
532 {
533 Theta = GenerateUserDefTheta();
534 }
535 Phi = 10.;
536 while(Phi > MaxPhi || Phi < MinPhi)
537 {
538 rndm = angRndm->GenRandPhi();
539 Phi = twopi * rndm;
540 }
541 }
542 else if(UserDistType == "phi")
543 {
544 Theta = 10.;
545 while(Theta > MaxTheta || Theta < MinTheta)
546 {
547 rndm = angRndm->GenRandTheta();
548 Theta = std::acos(1. - (2. * rndm));
549 }
550 Phi = 10.;
551 while(Phi > MaxPhi || Phi < MinPhi)
552 {
553 Phi = GenerateUserDefPhi();
554 }
555 }
556 else if(UserDistType == "both")
557 {
558 Theta = 10.;
559 while(Theta > MaxTheta || Theta < MinTheta)
560 {
561 Theta = GenerateUserDefTheta();
562 }
563 Phi = 10.;
564 while(Phi > MaxPhi || Phi < MinPhi)
565 {
566 Phi = GenerateUserDefPhi();
567 }
568 }
569 px = -std::sin(Theta) * std::cos(Phi);
570 py = -std::sin(Theta) * std::sin(Phi);
571 pz = -std::cos(Theta);
572
573 pmag = std::sqrt((px*px) + (py*py) + (pz*pz));
574
575 if(!UserWRTSurface)
576 {
577 G4double finx, finy, finz;
578 if (UserAngRef)
579 {
580 // Apply Rotation Matrix
581 // x * AngRef1, y * AngRef2 and z * AngRef3
582 finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x());
583 finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y());
584 finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z());
585 }
586 else // use mother coordinates
587 {
588 finx = px;
589 finy = py;
590 finz = pz;
591 }
592 G4double ResMag = std::sqrt((finx*finx) + (finy*finy) + (finz*finz));
593 finx = finx/ResMag;
594 finy = finy/ResMag;
595 finz = finz/ResMag;
596
597 mom.setX(finx);
598 mom.setY(finy);
599 mom.setZ(finz);
600 }
601 else // UserWRTSurface = true
602 {
603 G4double pxh = px/pmag;
604 G4double pyh = py/pmag;
605 G4double pzh = pz/pmag;
606 if(verbosityLevel > 1)
607 {
608 G4cout << "SideRefVecs " << posDist->GetSideRefVec1()
609 << posDist->GetSideRefVec2() << posDist->GetSideRefVec3()
610 << G4endl;
611 G4cout << "Raw Unit vector " << pxh
612 << "," << pyh << "," << pzh << G4endl;
613 }
614 G4double resultx = (pxh*posDist->GetSideRefVec1().x())
615 + (pyh*posDist->GetSideRefVec2().x())
616 + (pzh*posDist->GetSideRefVec3().x());
617
618 G4double resulty = (pxh*posDist->GetSideRefVec1().y())
619 + (pyh*posDist->GetSideRefVec2().y())
620 + (pzh*posDist->GetSideRefVec3().y());
621
622 G4double resultz = (pxh*posDist->GetSideRefVec1().z())
623 + (pyh*posDist->GetSideRefVec2().z())
624 + (pzh*posDist->GetSideRefVec3().z());
625
626 G4double ResMag = std::sqrt((resultx*resultx)
627 + (resulty*resulty)
628 + (resultz*resultz));
629 resultx = resultx/ResMag;
630 resulty = resulty/ResMag;
631 resultz = resultz/ResMag;
632
633 mom.setX(resultx);
634 mom.setY(resulty);
635 mom.setZ(resultz);
636 }
637
638 // particle_momentum_direction now contains unit momentum vector.
639
640 if(verbosityLevel > 0 )
641 {
642 G4cout << "Final User Defined momentum vector "
643 << particle_momentum_direction << G4endl;
644 }
645}
646
647G4double G4SPSAngDistribution::GenerateUserDefTheta()
648{
649 // Create cumulative histogram if not already done so.
650 // Then use RandFlat::shoot to generate the output Theta value.
651
652 if(UserDistType == "NULL" || UserDistType == "phi")
653 {
654 // No user defined theta distribution
655 G4cout << "Error ***********************" << G4endl;
656 G4cout << "UserDistType = " << UserDistType << G4endl;
657 return (0.);
658 }
659
660 // UserDistType = theta or both and so a theta distribution
661 // is defined. This should be integrated if not already done.
662 G4AutoLock l(&mutex);
663 if(!IPDFThetaExist)
664 {
665 // IPDF has not been created, so create it
666 //
667 G4double bins[1024],vals[1024], sum;
668 G4int ii;
669 G4int maxbin = G4int(UDefThetaH.GetVectorLength());
670 bins[0] = UDefThetaH.GetLowEdgeEnergy(std::size_t(0));
671 vals[0] = UDefThetaH(std::size_t(0));
672 sum = vals[0];
673 for(ii=1; ii<maxbin; ++ii)
674 {
675 bins[ii] = UDefThetaH.GetLowEdgeEnergy(std::size_t(ii));
676 vals[ii] = UDefThetaH(std::size_t(ii)) + vals[ii-1];
677 sum = sum + UDefThetaH(std::size_t(ii));
678 }
679 for(ii=0; ii<maxbin; ++ii)
680 {
681 vals[ii] = vals[ii]/sum;
682 IPDFThetaH.InsertValues(bins[ii], vals[ii]);
683 }
684 IPDFThetaExist = true;
685 }
686 l.unlock();
687
688 // IPDF has been created so carry on
689 //
690 G4double rndm = G4UniformRand();
691 return IPDFThetaH.GetEnergy(rndm);
692}
693
694G4double G4SPSAngDistribution::GenerateUserDefPhi()
695{
696 // Create cumulative histogram if not already done so.
697 // Then use RandFlat::shoot to generate the output Theta value.
698
699 if(UserDistType == "NULL" || UserDistType == "theta")
700 {
701 // No user defined phi distribution
702 G4cout << "Error ***********************" << G4endl;
703 G4cout << "UserDistType = " << UserDistType << G4endl;
704 return(0.);
705 }
706
707 // UserDistType = phi or both and so a phi distribution
708 // is defined. This should be integrated if not already done.
709 G4AutoLock l(&mutex);
710 if(!IPDFPhiExist)
711 {
712 // IPDF has not been created, so create it
713 //
714 G4double bins[1024],vals[1024], sum;
715 G4int ii;
716 G4int maxbin = G4int(UDefPhiH.GetVectorLength());
717 bins[0] = UDefPhiH.GetLowEdgeEnergy(std::size_t(0));
718 vals[0] = UDefPhiH(std::size_t(0));
719 sum = vals[0];
720 for(ii=1; ii<maxbin; ++ii)
721 {
722 bins[ii] = UDefPhiH.GetLowEdgeEnergy(std::size_t(ii));
723 vals[ii] = UDefPhiH(std::size_t(ii)) + vals[ii-1];
724 sum = sum + UDefPhiH(std::size_t(ii));
725 }
726 for(ii=0; ii<maxbin; ++ii)
727 {
728 vals[ii] = vals[ii]/sum;
729 IPDFPhiH.InsertValues(bins[ii], vals[ii]);
730 }
731 IPDFPhiExist = true;
732 }
733 l.unlock();
734
735 // IPDF has been create so carry on
736 //
737 G4double rndm = G4UniformRand();
738 return IPDFPhiH.GetEnergy(rndm);
739}
740
742{
743 G4AutoLock l(&mutex);
744 if (atype == "theta")
745 {
746 UDefThetaH = IPDFThetaH = ZeroPhysVector ;
747 IPDFThetaExist = false ;
748 }
749 else if (atype == "phi")
750 {
751 UDefPhiH = IPDFPhiH = ZeroPhysVector ;
752 IPDFPhiExist = false ;
753 }
754 else
755 {
756 G4cout << "Error, histtype not accepted " << G4endl;
757 }
758}
759
761{
762 // Local copy for thread safety
763 //
764 G4ParticleMomentum localM = particle_momentum_direction;
765
766 // Angular stuff
767 //
768 if(AngDistType == "iso")
769 GenerateIsotropicFlux(localM);
770 else if(AngDistType == "cos")
771 GenerateCosineLawFlux(localM);
772 else if(AngDistType == "planar")
773 GeneratePlanarFlux(localM);
774 else if(AngDistType == "beam1d" || AngDistType == "beam2d" )
775 GenerateBeamFlux(localM);
776 else if(AngDistType == "user")
777 GenerateUserDefFlux(localM);
778 else if(AngDistType == "focused")
779 GenerateFocusedFlux(localM);
780 else
781 G4cout << "Error: AngDistType has unusual value" << G4endl;
782 return localM;
783}
G4ThreeVector G4ParticleMomentum
#define G4MUTEXDESTROY(mutex)
Definition: G4Threading.hh:90
#define G4MUTEXINIT(mutex)
Definition: G4Threading.hh:87
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:52
double z() const
Hep3Vector unit() const
double x() const
void setY(double)
double y() const
Hep3Vector cross(const Hep3Vector &) const
void setZ(double)
void setX(double)
void InsertValues(const G4double energy, const G4double value)
G4double GetEnergy(const G4double value) const
G4double GetLowEdgeEnergy(const std::size_t index) const
std::size_t GetVectorLength() const
void SetBeamSigmaInAngX(G4double)
void SetBeamSigmaInAngR(G4double)
void SetPosDistribution(G4SPSPosDistribution *a)
void UserDefAngTheta(const G4ThreeVector &)
void SetFocusPoint(const G4ThreeVector &)
void SetAngDistType(const G4String &)
void UserDefAngPhi(const G4ThreeVector &)
G4ParticleMomentum GenerateOne()
void SetParticleMomentumDirection(const G4ParticleMomentum &aMomDirection)
void SetBeamSigmaInAngY(G4double)
void ReSetHist(const G4String &)
void SetBiasRndm(G4SPSRandomGenerator *a)
void DefineAngRefAxes(const G4String &, const G4ThreeVector &)
const G4ThreeVector & GetParticlePos() const
const G4String & GetSourcePosType() const
const G4ThreeVector & GetSideRefVec2() const
const G4ThreeVector & GetSideRefVec3() const
const G4ThreeVector & GetSideRefVec1() const
DLL_API const Hep3Vector HepZHat
Definition: ThreeVector.h:419
DLL_API const Hep3Vector HepXHat
DLL_API const Hep3Vector HepYHat
Definition: ThreeVector.h:419